如何从此SQL Server XML字段中获取列的列表?

时间:2011-09-13 08:59:39

标签: xml sql-server-2005 tsql

我有一个xml片段,如下面的例子,我想得到列的列表并将它们转换成逗号分隔的列表,但我真的很难弄清楚使用XML数据的语法类型和我发现的文档读起来像韩语立体声指令:(

<ROOT>
<DATAVIEW>sp_Demo</DATAVIEW>
<WHERECLAUSE>X=4</WHERECLAUSE>
<COLUMNS>
  <COLUMN>ImageHTML</COLUMN>
  <COLUMN>Task_ID</COLUMN>
</COLUMNS>
</ROOT>

任何人都可以指点一个初学者的例子,或者给我一个关于如何做到这一点的指针?

从上面的XML片段我想返回一个包含“ImageHTML,Task_ID”的字符串

嗯,这不是很漂亮,但这可以解决问题,感谢指针Louis。

DECLARE MY_CURSOR Cursor
FOR 
Select  Substring(Substring(CAST(T.Item.query('.') AS varchar(50)),0,LEN(CAST(T.Item.query('.') AS varchar(50)))-8),9,LEN(CAST(T.Item.query('.') AS varchar(50))))
From @Data.nodes('ROOT/COLUMNS/COLUMN') AS T(Item) 

    Open MY_CURSOR
    DECLARE @ColumnName varchar(50)
    DECLARE @RunningTotal varchar(2000)
    SET @RunningTotal=''

    FETCH NEXT FROM MY_CURSOR INTO @ColumnName
    WHILE (@@Fetch_STATUS<>-1)
    BEGIN
    IF (@@FETCH_STATUS<>-2)
    IF LEN(@RunningTotal)>0 SET @RunningTotal=@RunningTotal+','
    SET @RunningTotal=@RunningTotal+@ColumnName

    FETCH NEXT FROM MY_CURSOR INTO @ColumnName
    END
    CLOSE MY_CURSOR
    DEALLOCATE MY_CURSOR

    PRINT @RunningTotal

最终更新:当我的光标版本有效时,Akash在下面提供了一个更简洁的解决方案。

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

这里不需要光标。你需要两件事:

  • xml数据类型方法.nodes().value()
  • 用于从行集生成逗号分隔列表的众所周知的技巧

设定:

DECLARE @xml xml

SET @xml = '
<ROOT>
<DATAVIEW>sp_Demo</DATAVIEW>
<WHERECLAUSE>X=4</WHERECLAUSE>
<COLUMNS>
  <COLUMN>ImageHTML</COLUMN>
  <COLUMN>Task_ID</COLUMN>
</COLUMNS>
</ROOT>
'

输出:

DECLARE @output nvarchar(max)

SELECT
    @output = COALESCE(@output + ', ', '') + C.value('text()[1]', 'nvarchar(MAX)')
FROM
    @xml.nodes('//COLUMN') X(C)

SELECT @output

说明:

.nodes()在行中执行xml的 shred 。在这种情况下,它使用xpath //COLUMN询问xml,并生成一个行集,每个匹配的节点作为一行。此行集的别名为名为X的表,其中包含一列C

SELECT子句中,每个xml节点都使用text()提取.value()

@output技巧是生成逗号分隔列表的标准方法。

输出:

ImageHTML, Task_ID

希望这些术语和方法能够让您找到合适的文档和示例。