2009-08-27 35 views
0

我有哪裏我傳遞一個簡單的XML存儲過程:的Open XML插件 - SQL 2005

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

我有一個@temp表中的SQL具有ProductID列:

DECLARE @Temp TABLE (
ProductId NVARCHAR(10) 
)  

我需要編寫一個insert語句,它將遍歷XML中的ProductId(可以是無限的)並繼續插入(在@temp表中),直到XML沒有剩下的ProductId節點。

涉及遊標的解決方案是不可行的!

以下是我試圖執行代碼:

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

嘗試運行INSERT的SELECT部分​​,使用xml字符串替換@test。確保首先工作 – 2009-08-27 19:07:13

+0

不會允許我對字符串執行FROM操作。 – 2009-08-27 19:10:51

+0

是的,需要使用OPENXML - 請參閱我更新的答案。 Ref:OPENXML:http://msdn.microsoft.com/en-us/library/aa276847%28SQL.80%29.aspx – 2009-08-27 19:15:12

回答

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

剛剛添加了一個獨立的代碼來解釋我的例子仍然會拋出一個錯誤! – 2009-08-27 18:58:43

+0

完美謝謝! – 2009-08-27 19:33:38

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