首页 > 解决方案 > SQL Server:包含 XML 数据的列

问题描述

我想将 XML 数据中的值提取到列中。

我尝试使用这个:

DECLARE @xml XML
SELECT @xml = Data FROM synergy..XMLData

SELECT  
    xmlData.Col.value('(column/@value)[1]','varchar(255)') AS 'Artikelen',
    xmlData.Col.value('(column/@value)[2]','varchar(255)') AS 'Batchnummer',
    xmlData.Col.value('(column/@value)[3]','varchar(255)') AS 'Aantal'
FROM    
    @XML.nodes ('//table/rows/row/columns') xmldata(Col)

但是我只得到标题,但没有数据。

这就是 XML 的样子:

<?xml version="1.0" encoding="utf-16"?>  
<table>   
    <id>{941D5F5A-156A-4F19-A3B0-111E9825707B}</id>   
    <rows>     
       <row>       
           <columns>         
               <column name="Artikelen" value="102535.A.M2" type="System.String" />          
               <column name="Batchnummer" value="19D1739/133" type="System.String" />          
               <column name="Aantal" value="8" type="System.Int32" />          
               <column name="Opmerkingen" value="te weinig" type="System.String" />          
               <column name="Selecteren" value="1" type="System.String" />         
               <column name="DefaultKey" value="1" type="System.Int32" />        
           </columns>      
       </row>   
    </rows>    
    <key>DefaultKey</key>    
    <total>0</total>   
    <AddOnKey>0</AddOnKey>    
    <data />   
    <parameters />  
</table>

标签: sql-serverxmlexact-synergy-enterprise

解决方案


最好通过引用命名属性而不是它们的位置来分解 XML 并获取所需的数据。

SQL

DECLARE @xml XML = '
<table>
    <id>{941D5F5A-156A-4F19-A3B0-111E9825707B}</id>
    <rows>
        <row>
            <columns>
                <column name="Artikelen" value="102535.A.M2" type="System.String"/>
                <column name="Batchnummer" value="19D1739/133" type="System.String"/>
                <column name="Aantal" value="8" type="System.Int32"/>
                <column name="Opmerkingen" value="te weinig" type="System.String"/>
                <column name="Selecteren" value="1" type="System.String"/>
                <column name="DefaultKey" value="1" type="System.Int32"/>
            </columns>
        </row>
    </rows>
    <key>DefaultKey</key>
    <total>0</total>
    <AddOnKey>0</AddOnKey>
    <data/>
    <parameters/>
</table>';

SELECT col.value('(column[@name="Artikelen"]/@value)[1]','VARCHAR(255)') AS [Artikelen]
    ,  col.value('(column[@name="Batchnummer"]/@value)[1]','VARCHAR(255)') AS [Batchnummer]
    ,  col.value('(column[@name="Aantal"]/@value)[1]','INT') AS [Aantal]
FROM @XML.nodes ('/table/rows/row/columns') AS tab(col);

输出

+-------------+-------------+--------+
|  Artikelen  | Batchnummer | Aantal |
+-------------+-------------+--------+
| 102535.A.M2 | 19D1739/133 |      8 |
+-------------+-------------+--------+

推荐阅读