【问题标题】:How can I get a list of columns from this SQL Server XML field?如何从此 SQL Server XML 字段中获取列列表?
【发布时间】:2011-11-15 23:42:58
【问题描述】:

我有一个类似于以下示例的 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”的字符串

嗯,它不是很漂亮,但这可以解决问题,感谢路易斯的指点。

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 在下面提出了一个更简洁的解决方案。

【问题讨论】:

    标签: xml sql-server-2005 tsql


    【解决方案1】:

    【讨论】:

    • 它为我指明了 XQUERY 的方向,这比我以前知道的要多:)
    • 嗯,这似乎是您所需要的:它声明了一个带有 XML 代码的变量并浏览了树......希望它对您有所帮助。
    【解决方案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 分解 成行。在这种情况下,它使用 xpath //COLUMN 询问 xml 并生成一个行集,其中每个匹配节点作为一行。此行集别名为名为 X 的表,其中有一列 C

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

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

    输出:

    ImageHTML, Task_ID
    

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

    【讨论】:

    • 非常感谢 Akash,这看起来比我的做法更整洁 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多