2009-08-27 15 views
0

私は、単純なXML渡していますストアドプロシージャがあります。オープンXML挿入 - SQL 2005

DECLARE @Temp TABLE (
ProductId NVARCHAR(10) 
)  

'<Products><ProductId>1</ProductId><ProductId>2</ProductId></Products>' 

を私は商品コード列を持つSQLで@tempのテーブルを持っています

XMLにProductIdをループする(無限になる可能性があります)、XMLにProductIdノードが残っていなくなるまで(@tempテーブルに)挿入する文を書く必要があります。

カーソルを含むソリューションは実現不可能です!続き

は、私が実行しようとしているコードです:

Declare @test XML 
SET @test = '<Products><ProductId>1</ProductId><ProductId>2</ProductId></Products>' 
DECLARE @Temp TABLE(  
    ProductId NVARCHAR(10) 
    ) 
INSERT INTO @Temp(ProductId) 
SELECT tab.col.value('./ProductId[1]','NVARCHAR(10)') AS 'ProductId' 
FROM @test 
CROSS APPLY 
xml_data.nodes('//Products') AS tab(col) 

私はエラーを取得しておいてください。

Must declare the table variable "@test". 
+0

@testをxml文字列で置き換えて、INSERTのSELECT部分​​だけを実行してみてください。最初に動作することを確認してください –

+0

私は文字列のFROMを実行できません。 –

+0

ええ、OPENXMLを使用する必要があります - 私の更新された答えを参照してください。 Ref:OPENXML:http://msdn.microsoft.com/en-us/library/aa276847%28SQL.80%29.aspx –

答えて

2
DECLARE @test XML 
    SET @test = '<Products><ProductId>1</ProductId><ProductId>2</ProductId></Products>' 

DECLARE @Temp TABLE(ProductId NVARCHAR(10)) 

DECLARE @docHandle int 
EXEC sp_xml_preparedocument @docHandle OUTPUT, @doc 

INSERT INTO @Temp(ProductId) 
    SELECT t.value('./ProductId[1]','NVARCHAR(10)') AS 'ProductId' 
     FROM OPENXML(@docHandle, '//Products', 1) t 

EXEC sp_xml_removedocument @docHandle 
+0

私の例を説明するスタンドアロンコードを追加しただけでも、エラーがスローされます。 –

+0

完璧に感謝します! –

2
DECLARE @idoc int 

DECLARE @doc varchar(1000) 

SET @doc =' 
<OutLookContact> 
<Contact FirstName="Asif" LastName="Ghafoor" EmailAddress1="[email protected]" /> 
<Contact FirstName="Rameez" LastName="Ali" EmailAddress1="[email protected]" /> 
<Contact FirstName="Aneel" LastName="Maqsood" EmailAddress1="[email protected]" /> 
</OutLookContact>' 

--Create an internal representation of the XML document. 

EXEC sp_xml_preparedocument @idoc OUTPUT, @doc 

-- Execute a SELECT statement that uses the OPENXML rowset provider. 

DECLARE @Temp TABLE(FirstName VARCHAR(250),LastName VARCHAR(250),Email1 VARCHAR(250)) 

INSERT INTO @Temp(FirstName,LastName,Email1) 



SELECT * 

FROM OPENXML (@idoc, '/OutLookContact/Contact',1) 

WITH (FirstName varchar(50),LastName varchar(50),EmailAddress1 varchar(50)) 


select FirstName,LastName,Email1 from @Temp 
関連する問題