周五下午这似乎是个好主意,但我遇到了一些麻烦。我之前没有使用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)
答案 0 :(得分: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)
取决于你想要达到的目标。
答案 1 :(得分:1)
该错误是由于节点表达式中的/
尾随。它应该是/Root
。
BTW,我认为您正在寻找一个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)