2012-10-01 28 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)