【问题标题】:Xml Column Into Multiple Column With Separated Comma In Sql Server在Sql Server中将Xml列分成多个用逗号分隔的列
【发布时间】:2019-09-25 15:49:54
【问题描述】:

使用 Sql Server 2012

我有一个表,其中包含如下 xml 格式的字符串中的单个字段,

a
----
<data1>11</data1><data2>4</data2><data1>12</data1><data2>5</data2>

我想要这样的结果表,每列包含单独的逗号

data1|data2
-----------
11,12|4,5

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    这是您的脚本。您的 a 列不是有效的 XML 类型,因此我需要附加为根元素。

    declare @strxml xml = concat('<t>', '<data1>11</data1><data2>4</data2><data1>12</data1><data2>5</data2>', '</t>')
    
    SELECT
            STUFF((SELECT ',' + b.dat.value('.', 'NVARCHAR(MAX)')
                   FROM   tmp.node.nodes('data1') b (dat)
                   FOR XML PATH(''),TYPE).value('.', 'NVARCHAR(MAX)'),
                  1, 1, '') AS a,
    
            STUFF((SELECT ',' + a.dat.value('.', 'NVARCHAR(MAX)')
                   FROM   tmp.node.nodes('data2') a (dat)
                   FOR XML PATH(''),TYPE).value('.', 'NVARCHAR(MAX)'),
                  1, 1, '') AS b
    FROM @strxml.nodes('/t') tmp(node);
    

    应用你的表。只需替换 test3yourcolumn

    SELECT
            STUFF((SELECT ',' + b.dat.value('.', 'NVARCHAR(MAX)')
                   FROM   tmp.node.nodes('data1') b (dat)
                   FOR XML PATH(''),TYPE).value('.', 'NVARCHAR(MAX)'),
                  1, 1, '') AS a,
    
            STUFF((SELECT ',' + a.dat.value('.', 'NVARCHAR(MAX)')
                   FROM   tmp.node.nodes('data2') a ( dat )
                   FOR XML PATH(''),TYPE).value('.', 'NVARCHAR(MAX)'),
                  1, 1, '') AS b
    FROM test3 t
    CROSS APPLY (select cast(concat('<t>', yourcolumn, '</t>') AS xml)) as t1(X)
    CROSS APPLY t1.X.nodes('t') AS tmp(node)
    

    【讨论】:

    • 我们可以不使用声明xml变量吗,
    • 我的意思是来自 (SELECT ... ).nodes('/t') tmp(node);
    • 立即尝试。您的列不是有效的 xml 类型,所以我需要附加 作为根元素
    【解决方案2】:
    DECLARE @XMLData XML 
    SET @XMLData = '<a> 
                    <data1>11</data1><data2>4</data2><data1>12</data1><data2>5</data2>
                </a>'
    
    SELECT REPLACE
    (
        @XMLData.query('data(a/data1)').value('.','varchar(100)')
        ,' ' -- replace the white spaces
        ,',' -- replace the white spaces with commas
    ) AS data1,
    
    REPLACE
    (
        @XMLData.query('data(a/data2)').value('.','varchar(100)')
        ,' '
        ,','
    ) AS data2
    

    如果你没有任何根

    DECLARE @XMLData XML 
    SET @XMLData = ' 
                    <data1>11</data1><data2>4</data2><data1>12</data1><data2>5</data2>
                '
    
    SELECT REPLACE
    (
        @XMLData.query('data(data1)').value('.','varchar(100)')
        ,' ' -- replace the white spaces
        ,',' -- replace the white spaces with commas
    ) AS data1,
    
    REPLACE
    (
        @XMLData.query('data(data2)').value('.','varchar(100)')
        ,' '
        ,','
    ) AS data2
    

    注意:-

    1.首先我们有空格分隔值...

    2. 为了实现我们的目标,我们可以使用 Replace 函数将空格替换为逗号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 2016-10-24
      • 2017-12-08
      • 2011-04-04
      • 1970-01-01
      相关资源
      最近更新 更多