2

この質問は、次の優れた回答に続きます: T-SQL XML クエリ、一致するノードを個々の行に分離する方法は? 次の値の場合:

   <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

(すべて 1 つの列に)

-->今後 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>これにより、出力ごとに 2 つの列が得られます。

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

1 つの列だけが必要な場合は、代わりにこれを使用できます。

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 に答える