我从外部系统获取固定的XML,并且在T-SQL中需要在<document>
标签中附加一些唯一的ID,并将所有数据插入2个表中。
这是我得到的XML:
<root>
<document number="1234">
<data1>
<item1 d="100"/>
<item1 d="200"/>
</data1>
<data2>
<item2 d="111"/>
<item2 d="222"/>
</data2>
</document>
<document number="1234">
<data1>
<item1 d="300"/>
<item1 d="400"/>
</data1>
</document>
<document number="1234">
<data1>
<item1 d="500"/>
</data1>
<data2>
<item2 d="555"/>
</data2>
</document>
</root>
我需要将上述XML插入到tData1
级具有唯一docid的2个表tData2
和<document>
中。
表tData1
应该看起来像这样:
docid number d
---------------------
1 1234 100
1 1234 200
2 1234 300
2 1234 400
3 1234 500
表tData2
应该看起来像这样:
docid number d
---------------------
1 1234 111
1 1234 222
3 1234 555
在将上述XML转换为这些表时,如何插入docid
字段?
答案 0 :(得分:0)
您可以在nodes
中使用CROSS APPLY
,如下所示:
DECLARE @x XML='<root>
<document number="1234">
<data1>
<item1 d="100"/>
<item1 d="200"/>
</data1>
<data2>
<item2 d="111"/>
<item2 d="222"/>
</data2>
</document>
<document number="1234">
<data1>
<item1 d="300"/>
<item1 d="400"/>
</data1>
</document>
<document number="1234">
<data1>
<item1 d="500"/>
</data1>
<data2>
<item2 d="555"/>
</data2>
</document>
</root>'
SELECT Q1.docid, Q1.number, Q2.d
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY T1.N1) AS docid,
N1.value('@number','varchar(10)') AS number,
N1.query('.') AS X
FROM @x.nodes('root/document') T1(N1)
) Q1
CROSS APPLY (
SELECT N2.value('@d','varchar(10)') AS d
FROM Q1.x.nodes('document/data1/item1') T2(N2)
) Q2
SELECT Q1.docid, Q1.number, Q2.d
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY T1.N1) AS docid,
N1.value('@number','varchar(10)') AS number,
N1.query('.') AS X
FROM @x.nodes('root/document') T1(N1)
) Q1
CROSS APPLY (
SELECT N2.value('@d','varchar(10)') AS d
FROM Q1.x.nodes('document/data2/item2') T2(N2)
) Q2
要生成docid
,我已经在节点列上使用了ROW_NUMBER,如http://dataeducation.com/uniquely-identifying-xml-nodes-with-dense_rank/中所述。