【问题标题】:Retrieving attribute from XML file in SQL在 SQL 中从 XML 文件中检索属性
【发布时间】:2019-05-02 13:20:13
【问题描述】:

我正在尝试从 Microsoft SQL Server 中的 XML 文件中检索属性。我的查询适用于获取元素,但不适用于属性。

这是 XML 的一部分:

<DN_CHARGE_LINES>
        <DN_CHARGE_LINE LINE_ID="201903297661150">
            <CHARGE_NAME>HANDLING CHARGE</CHARGE_NAME>
            <CURRENCY_CODE>USD</CURRENCY_CODE>
            <RATE>75</RATE>
            <QTY>1</QTY>
            <LINE_AMOUNT>75</LINE_AMOUNT>
            <JOB_ID>201903137354913</JOB_ID>
        </DN_CHARGE_LINE>
    </DN_CHARGE_LINES>

这是我目前使用的代码:

INSERT INTO WWL_DNHead (DN_ID, TO_PARTY_NAME, TO_PARTY_ADDRESS)
SELECT 
       MY_XML.DN_HEAD.query('@DN_ID').value('.', 'VARCHAR(25)'),
       MY_XML.DN_HEAD.query('TO_PARTY_NAME').value('.', 'VARCHAR(25)'),
       MY_XML.DN_HEAD.query('TO_PARTY_ADDRESS').value('.', 'VARCHAR(25)')


FROM (SELECT CAST(MY_XML AS xml)
     FROM OPENROWSET(BULK '\\shareapp\c$\temp\XML_4\DN_DN1903297826.xml', SINGLE_BLOB) AS T(MY_XML)) AS T(MY_XML)
     CROSS APPLY MY_XML.nodes('WWLDCEDI/DN_HEAD') AS MY_XML (DN_HEAD)

     SELECT * FROM WWL_DNHead

除了CHARGE_NAMECURRENCY_CODE 和该节点中的所有其他元素(我现在能够获取)之外,我还想检索 LINE_ID 并将其显示在 SQL 表中。

【问题讨论】:

  • 您发布的 xml 与查询不匹配(您使用不同的名称)。
  • 问题不清楚,但根据我的理解。你在寻找类似MY_XML.DN_HEAD.value('(./*/@LINE_ID)[1]','varchar(40)')
  • LINE_ID 和 DN_ID 是同一种属性,我已经尝试过您的解决方案,但它也给了我以下错误:“XQuery [T.MY_XML.query()]: Attribute may not appear outside一个元素”

标签: sql sql-server xml tsql


【解决方案1】:

您可以使用nodes 将您的XML 拆分为元素值,然后使用value 提取您需要的值:

declare @table table (MY_XML xml)

insert into @table select
'<DN_CHARGE_LINES>
    <DN_CHARGE_LINE LINE_ID="201903297661150">
        <CHARGE_NAME>HANDLING CHARGE</CHARGE_NAME>
        <CURRENCY_CODE>USD</CURRENCY_CODE>
        <RATE>75</RATE>
        <QTY>1</QTY>
        <LINE_AMOUNT>75</LINE_AMOUNT>
        <JOB_ID>201903137354913</JOB_ID>
    </DN_CHARGE_LINE>
</DN_CHARGE_LINES>'

select  
     cn.s.value('@LINE_ID'        , 'nvarchar(max)') AS LINE_ID
    ,cn.s.value('CHARGE_NAME[1]'  , 'nvarchar(max)') AS CHARGE_NAME
    ,cn.s.value('CURRENCY_CODE[1]', 'nvarchar(max)') AS CURRENCY_CODE
    ,cn.s.value('RATE[1]'         , 'nvarchar(max)') AS RATE
    ,cn.s.value('QTY[1]'          , 'nvarchar(max)') AS QTY
    ,cn.s.value('JOB_ID[1]'       , 'nvarchar(max)') AS JOB_ID
from @table
CROSS APPLY MY_XML.nodes('//DN_CHARGE_LINE') cn(s)

结果:

如果你有更多&lt;DN_CHARGE_LINE&gt; 元素:

declare @table table (MY_XML xml)

insert into @table select
'<DN_CHARGE_LINES>
    <DN_CHARGE_LINE LINE_ID="201903297661150">
        <CHARGE_NAME>HANDLING CHARGE</CHARGE_NAME>
        <CURRENCY_CODE>USD</CURRENCY_CODE>
        <RATE>75</RATE>
        <QTY>1</QTY>
        <LINE_AMOUNT>75</LINE_AMOUNT>
        <JOB_ID>201903137354913</JOB_ID>
    </DN_CHARGE_LINE>
    <DN_CHARGE_LINE LINE_ID="123123123123123">
        <CHARGE_NAME>HANDLING CHARGE 2</CHARGE_NAME>
        <CURRENCY_CODE>EUR</CURRENCY_CODE>
        <RATE>100</RATE>
        <QTY>2</QTY>
        <LINE_AMOUNT>10</LINE_AMOUNT>
        <JOB_ID>201903137565987</JOB_ID>
    </DN_CHARGE_LINE>
    <DN_CHARGE_LINE LINE_ID="123456789123456">
        <CHARGE_NAME>HANDLING CHARGE 3</CHARGE_NAME>
        <CURRENCY_CODE>USD</CURRENCY_CODE>
        <RATE>3</RATE>
        <QTY>4</QTY>
        <LINE_AMOUNT>30</LINE_AMOUNT>
        <JOB_ID>201903137111222</JOB_ID>
    </DN_CHARGE_LINE>
</DN_CHARGE_LINES>'

select  
     cn.s.value('@LINE_ID'        , 'nvarchar(max)') AS LINE_ID
    ,cn.s.value('CHARGE_NAME[1]'  , 'nvarchar(max)') AS CHARGE_NAME
    ,cn.s.value('CURRENCY_CODE[1]', 'nvarchar(max)') AS CURRENCY_CODE
    ,cn.s.value('RATE[1]'         , 'nvarchar(max)') AS RATE
    ,cn.s.value('QTY[1]'          , 'nvarchar(max)') AS QTY
    ,cn.s.value('JOB_ID[1]'       , 'nvarchar(max)') AS JOB_ID
from @table
CROSS APPLY MY_XML.nodes('//DN_CHARGE_LINE') cn(s)

这是结果:

【讨论】:

    猜你喜欢
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2011-08-01
    • 2012-05-12
    • 1970-01-01
    • 2013-02-01
    相关资源
    最近更新 更多