【问题标题】:get comma separated values from xml data从 xml 数据中获取逗号分隔的值
【发布时间】:2014-04-09 08:30:41
【问题描述】:

我知道如何在最简单的情况下做到这一点,例如

DECLARE @commaSeparatedValues NVARCHAR(MAX)
DECLARE @xml XML = N'<id>1</id>
<name>test</name>
<istest>1</istest>'

;WITH nodes AS 
(
    SELECT Tbl.Col.value('.', 'nvarchar(max)') as Value
    FROM @xml.nodes('*/text()') Tbl(Col)
),
prepareStrings
AS
(
    SELECT IIF(ISNUMERIC(n.value) = 1, n.Value, '''' + n.Value + '''') AS Value
    FROM nodes n
)
SELECT @commaSeparatedValues = CASE WHEN @commaSeparatedValues IS NULL THEN s.Value ELSE @commaSeparatedValues + ',' + s.value END
FROM prepareStrings s

SELECT @commaSeparatedValues as csv

这非常有效。当我想以这种方式解析以下 xml 数据时,就会出现问题。 我在编写正确的查询时遇到问题。

DECLARE @xml XML = N'
<e>
  <id>1</id>
  <name>test</name>
  <istest>1</istest>
</e>
<e>
  <id>2</id>
  <name>test2</name>
  <istest>0</istest>
</e>
'

我可以通过使用逐行获取元素

select Tbl.col.query('.') as [xml]
from @xml.nodes('e') Tbl(col)

我不知道如何继续前进。不知道如何使用此查询,现在查询 [xml] 列。

【问题讨论】:

    标签: sql-server xml tsql xquery


    【解决方案1】:

    请尝试以下 SQL 查询

    DECLARE @commaSeparatedValues NVARCHAR(MAX)
    DECLARE @xml XML = N'
    <e>
      <id>1</id>
      <name>test1</name>
      <istest>1</istest>
    </e>
    <e>
      <id>2</id>
      <name>test2</name>
      <istest>2</istest>
    </e>
    '
    
    ;with cte as (
        select 
            rownr = ROW_NUMBER() over (order by @commaSeparatedValues),
            Tbl.col.query('.') as [xml]
        from @xml.nodes('e') Tbl(col)
    ), cols as (
        select
            rownr,
            Tbl.Col.value('.', 'nvarchar(max)') as Value
        from cte
        cross apply cte.xml.nodes('//text()') Tbl(Col)
    )
    select distinct 
         STUFF((
           SELECT ',' + IIF(ISNUMERIC(value) = 1, Value, '''' + Value + '''')
           FROM cols SSF WHERE SSF.rownr = S.rownr
           FOR XML PATH(''),TYPE
           ).value('.','VARCHAR(MAX)'
         ), 1, 1, '')
        from cols S
    

    我使用SQL row_number() function对记录进行编号,并在将它们分成值时区分列值(第二个CTE使用Partition By子句对行数据中的列进行排序)

    然后我使用 SQL string concatenation 方法和 XML PATH() 将字符串值连接成逗号分隔的字符串

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      你在寻找这样的东西吗?

      DECLARE @xml XML = N'
      <e>
        <id>1</id>
        <name>test</name>
        <istest>1</istest>
      </e>
      <e>
        <id>2</id>
        <name>test2</name>
        <istest>0</istest>
      </e>'
      
      SELECT
          XC.value('(id)[1]', 'varchar(10)') + ',' +
          XC.value('(name)[1]', 'varchar(100)') + ',' +
          xc.value('(istest)[1]', 'varchar(10)')
      FROM @Xml.nodes('/e') AS XT(XC)
      

      这个输出:

      1,test,1
      2,test2,0
      

      基本上,.nodes() 操作符将创建一个 XML 片段的“虚拟列表”(XML 文档中的每个 &lt;e&gt; 节点一个),然后为其中的每一行选择“到达”该 XML 片段虚拟表并将由逗号分隔的各个部分连接在一起,形成一个字符串

      【讨论】:

      • 我忘了提到,xml 元素名称会有所不同。我正在寻找通用的代码。正如您在我之前的帖子中看到的,我没有使用任何元素名称。如果要添加 xml 中的任何新元素,我也希望结果中包含此元素值。
      猜你喜欢
      • 2017-08-04
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多