[英]Converting xml values to rows in SQL Server like oracle XAMLTABLE
我有一個包含這種格式的 XML 值的表
id| xml_record
--+------------
1 | xmlvalue
2 | xmlvalue
xml 值是這種格式
<record>
<c2>date1</c2>
<c2 m="2">date2</c2>
<c2 m="3">date3</c2>
<c3>number1</c3>
<c3 m="2">number2</c3>
<c3 m="3">number3</c3>
</record>
我需要一個查詢來生成這個:
id | pmt_pos | pmt_date | pmt_number
---+---------+----------+-----------
1 | 1 | date1 | number1
1 | 2 | date2 | number2
1 | 3 | date3 | number3
在 Oracle 中,我成功地使用以下查詢生成兩個帶有 id、日期和數字的虛擬表,並將它們連接到 id 和每一行的位置:
SELECT t1.id
,t1.pmt_pos
,t1.pmt_date
,t2.pmt_number
FROM (
SELECT t.id
,xt.pmt_date
,nvl(xt.pmt_pos, 1) pmt_pos
FROM myTable t
,XMLTABLE('/row/c2' passing t.xml_record columns pmt_date VARCHAR(8) path '/', pmt_pos VARCHAR(3) path '@m') xt
) t1
JOIN (
SELECT t.id
,xt.pmt_number
,nvl(xt.pmt_pos, 1) pmt_pos
FROM myTable t
,XMLTABLE('/row/c34' passing t.xml_record columns pmt_number VARCHAR(50) path '/', pmt_pos VARCHAR(3) path '@m') xt
) t2 ON t1.id = t2.id
AND t1.pmt_pos = t2.pmt_pos
ORDER BY t1.id
是否有與 SQL 中的 Oracle xmltable 等效的功能或其他方式來實現相同的結果?
雖然沒有完全等效的 XMLTABLE,但 xml 數據類型的節點方法可以實現類似的結果。 對於上面的例子,它會像這樣工作:
DECLARE @XML AS XML = '
<record>
<c2>date1</c2>
<c2 m="2">date2</c2>
<c2 m="3">date3</c2>
<c3>number1</c3>
<c3 m="2">number2</c3>
<c3 m="3">number3</c3>
</record>'
DECLARE @t TABLE (ID int, XMLRECORD XML)
INSERT INTO @t values (1,@xml)
SELECT
ID
,isnull(t1.value('(@m)[1]','nvarchar(200)'),1) AS pmt_pos
,t1.query('.').value('/','nvarchar(30)') pymt_date
,t2.query('.').value('/','nvarchar(30)') pmt_number
FROM @t x
cross APPLY x.XMLRECORD.nodes('/record/c2') AS T1(t1)
cross APPLY x.XMLRECORD.nodes('/record/c3') AS T2(t2)
where isnull(t1.value('(@m)[1]','nvarchar(200)'),1) = isnull(t2.value('(@m)[1]','nvarchar(200)'),1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.