2

这个问题紧随这个很好的答案:T-SQL XML Query, how to separate nodes into individual rows? 如果值在哪里:

   <child>
    <name>Fred</name>
    <sname>Flintstone</name>
   </child>
   <child>
    <name>Bill</name>
    <sname>Gates</name>
   </child>

我希望输出如下:

Fred
Flintstone
Bill
Gates

或者更好的是,这个:

name: Fred
sname: Flintstone
name: Bill
sname: Gates

(全部在一列中)

-->由于在接下来的 3 小时内我无法回答自己的问题,我将按照 stackoverflow 的建议编辑我的问题。这是我对自己问题的回答:

我想通了!:-) 所以我有义务分享我自己的解决方案。这里是:

SELECT
  distinct childs.value('fn:local-name(.)', 'nvarchar(50)') + '=' + childs.value('(text())[1]', 'varchar(50)') as Children
FROM  
  #t CROSS APPLY
  data.nodes('//parent/child/*') AS Children(childs)  

感谢任何人看我的问题!

4

2 回答 2

2
declare @XML xml
set @XML = 
'<child>
  <name>Fred</name>
  <sname>Flintstone</sname>
 </child>
 <child>
   <name>Bill</name>
   <sname>Gates</sname>
 </child>'

select N.value('concat(local-name(.),": ",.)', 'varchar(max)')
from @XML.nodes('/child/*') as T(N)

结果:

name: Fred 
sname: Flintstone 
name: Bill 
sname: Gates 

更新:
使用表格和保证order by

declare @XML xml
set @XML = 
'<child>
  <name>Fred</name>
  <sname>Flintstone</sname>
 </child>
 <child>
   <name>Bill</name>
   <sname>Gates</sname>
 </child>'

declare @T table (ID int identity primary key, XMLColumn xml)
insert into @T values(@XML)
insert into @T values(@XML)

select ID,
       Names
from
  (
    select ID,
           N.value('concat(local-name(.),": ",.)', 'varchar(max)') as Names,
           row_number() over(partition by ID order by T.N) as rn
    from @T
      cross apply XMLColumn.nodes('/child/*') as T(N)
  ) T
order by ID, rn 
于 2012-05-05T15:45:05.490 回答
1

<child>这为您提供了每个输出的两列:

DECLARE @input XML = '<child>
    <name>Fred</name>
    <sname>Flintstone</sname>
   </child>
   <child>
    <name>Bill</name>
    <sname>Gates</sname>
   </child>'

SELECT
    'name: ' + child.value('(name)[1]', 'varchar(50)'),
    'sname: ' + child.value('(sname)[1]', 'varchar(50)')
FROM @input.nodes('/child') AS nodes(child)

输出是:

name: Fred  |  sname: Flintstone
name: Bill  |  sname: Gates

如果你只想要一列,你可以使用它来代替:

SELECT
    'name: ' + child.value('(name)[1]', 'varchar(50)')
FROM @input.nodes('/child') AS nodes(child)

UNION

SELECT
    'sname: ' + child.value('(sname)[1]', 'varchar(50)')
FROM @input.nodes('/child') AS nodes(child)

这给了你这个输出:

(No column name)
name: Bill
name: Fred
sname: Flintstone
sname: Gates
于 2012-05-05T11:18:29.400 回答