2017-07-18 121 views
-1

我需要從XML獲得所有值要麼呈現元素或屬性。如何在SQL中獲取XML元素和屬性值?

例子:

DECLARE @XML = '<root> 
        <row1 attr1="x">1</row1> 
        <row2 attr2="x">2</row2> 
       </root>' 

在這裏,我的預期輸出:

Column   Value 
---------------------  
row1    1 
attr1    x 
row2    1 
attr2    x 

我能夠得到的元素,並通過使用下面的查詢單獨的屬性值。

SELECT 
    element.value('local-name(.)', 'VARCHAR(50)'), 
    element.value('.', 'VARCHAR(100)') 
FROM 
    @OldXML.nodes('/root/*') node(element) 

SELECT 
    element.value('local-name(.)', 'VARCHAR(50)'), 
    element.value('.', 'VARCHAR(100)') 
FROM 
    @OldXML.nodes('/root/row1/@*') node(element) 

SELECT 
    element.value('local-name(.)', 'VARCHAR(50)'), 
    element.value('.', 'VARCHAR(100)') 
FROM 
    @OldXML.nodes('/root/row2/@*') node(element) 

但是,我需要在單個查詢中獲取值。

我上網的方法很多,但我不能得到這個需求的解決方案。

有沒有辦法做到這一點?

+1

XML的支持是**高度特定供應商的** - 所以請添加標籤到指定是使用了'mysql','postgresql','SQL-server','oracle'或'db2' - 或完全是另一回事。 –

回答

0

試試這個UNION ALL

SELECT 
    element.value('local-name(.)', 'VARCHAR(50)'), 
    element.value('.', 'VARCHAR(100)') 
FROM 
    @OldXML.nodes('/root/*') node(element) 
UNION ALL 
SELECT 
    element.value('local-name(.)', 'VARCHAR(50)'), 
    element.value('.', 'VARCHAR(100)') 
FROM 
    @OldXML.nodes('/root/row1/@*') node(element) 
UNION ALL 
SELECT 
    element.value('local-name(.)', 'VARCHAR(50)'), 
    element.value('.', 'VARCHAR(100)') 
FROM 
    @OldXML.nodes('/root/row2/@*') node(element) 
+0

我試過了。但是,這個查詢也會影響性能。 – LTA

0

我不知道甲骨文如何深刻支持XQuery。你可能會改變你這樣的XML(SQL-Server的語法):

DECLARE @XML XML = '<root> 
         <row1 attr1="x" attrAdd="test">1</row1> 
         <row2 attr2="y">2</row2> 
         <row3>3</row3> 
        </root>'; 

SELECT @XML.query 
(
N' 
    <root> 
    { 
    for $e in /root/* 
    return <element type="element" name="{local-name($e)}" value="{$e/text()}"/> 
    } 
    { 
    for $a in /root/*/@* 
    return <element type="attr" parent="{local-name($a/..)}" name="{local-name($a)}" value="{$a}"/> 
    } 
    </root> 
' 
); 

結果

<root> 
    <element type="element" name="row1" value="1" /> 
    <element type="element" name="row2" value="2" /> 
    <element type="element" name="row3" value="3" /> 
    <element type="attr" parent="row1" name="attr1" value="x" /> 
    <element type="attr" parent="row1" name="attrAdd" value="test" /> 
    <element type="attr" parent="row2" name="attr2" value="y" /> 
</root> 

另外,嵌套的方法將允許保留元素之間的關係和屬性:

SELECT @XML.query 
(
N' 
    <root> 
    { 
     for $e in /root/* 
     return 
     <element tag="{local-name($e)}" value="{$e/text()}"> 
     { 
      for $a in $e/@* 
      return <attribute tag="{local-name($a)}" value="{$a}"/> 
     } 
     </element> 
    } 
    </root> 
' 
) 

結果

<root> 
    <element tag="row1" value="1"> 
    <attribute tag="attr1" value="x" /> 
    <attribute tag="attrAdd" value="test" /> 
    </element> 
    <element tag="row2" value="2"> 
    <attribute tag="attr2" value="y" /> 
    </element> 
    <element tag="row3" value="3" /> 
</root> 

這兩種方法都將允許讀取表格中的數據。

相關問題