我有一个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在下面提供了一个更简洁的解决方案。
答案 0 :(得分:2)
答案 1 :(得分:2)
这里不需要光标。你需要两件事:
.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
希望这些术语和方法能够让您找到合适的文档和示例。