簡體   English   中英

將 xml 值轉換為 SQL Server 中的行,如 oracle XAMLTABLE

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM