2012-10-01 32 views
1

星期五下午這似乎是一個好主意,但我遇到了一些麻煩。我之前沒有使用SQL XML查詢,所以我可能只是做了一件非常愚蠢的事情。基本上我想傳遞一系列字符串來查詢一個表到一個存儲過程。在SQL中查詢XML參數

我想了一個位,使用CSV考慮,然後決定嘗試做到這一點使用XML。所以我的XML看起來像:

<Root> 
    <string>value</string> 
    <string>value</string> 
    <string>value</string> 
    <string>value</string> 
</Root> 

我傳遞到這一個存儲過程作爲XML值類型:

CREATE PROCEDURE usp_UpdateHotelImages 
    -- Add the parameters for the stored procedure here 
    @hotelID int, 
    @imageIDs xml 
AS 
BEGIN 

所以我想切碎的XML轉換成字符串的表。

我的SQL是這樣的:

SELECT Child.value('(string)[1]', 'varchar(200)') 
FROM @imageIDs.nodes('/Root/') AS N(Child)) 

但我不斷收到錯誤消息XQuery [nodes()]: Syntax error near '<eof>', expected a "node test".

我可能做一些令人難以置信的愚蠢這裏,所以任何幫助將受到歡迎。

更新

我打破它分解成一個單一的查詢的幫助:

DECLARE @imageIDs xml 
SET @imageIDs = '<Root> 
    <string>value</string> 
    <string>value</string> 
    <string>value</string> 
    <string>value</string> 
</Root>' 

SELECT Child.value('(string)[1]', 'varchar(200)') 
     FROM @imageIDs.nodes('/Root/') AS N(Child) 

回答

2

的問題是在節點函數的最後/

SELECT Child.value('(string)[1]', 'varchar(200)') 
FROM @imageIDs.nodes('/Root') AS N(Child) 

或可替代

SELECT Child.value('(.)[1]', 'varchar(200)') 
FROM @imageIDs.nodes('/Root/*') AS N(Child) 

取決於你想要達到的目的。

+0

這是幫助,不再讓例外但它只返回一行? – Liam

+0

您閱讀我的想法! TA! – Liam

1

這個錯誤是因爲尾隨在你的節點表達式/的。它應該是/Root

順便說一句,我認爲你正在尋找一個SELECT爲這是由以下實現了表返回值:

DECLARE @imageIDs XML 

SELECT @imageIDs = ' 
<Root> 
    <string>value</string> 
    <string>value2</string> 
    <string>value3</string> 
    <string>value4</string> 
</Root>' 

SELECT 
    Child.value('(.)[1]', 'varchar(200)') 
FROM @imageIDs.nodes('/Root/string') AS N(Child) 

結果:

value 
value2 
value3 
value4 

(4 row(s) affected)