1

周五下午这似乎是个好主意,但我遇到了一些麻烦。我以前没有使用过 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)
4

2 回答 2

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)

取决于您要达到的目标。

于 2012-10-01T08:41:09.397 回答
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)
于 2012-10-01T08:42:51.487 回答