sql-server - 在 SQL Server 中选择 XML 元素

标签 sql-server xpath xquery

我有一些 XML 需要使用 SQL Server 2008 进行解析。我想我已经接近获得我想要的结果了,但我没有正确的语法(我相信)。

我有以下内容:

DECLARE @doc XML
SET @doc = '<ROOT>          
    <InvoiceDetail>
        <OrderId>1000000</OrderId>
        <OrderTypeId>2</OrderTypeId>
        <Id>2000</Id>
        <InvoiceItems>
            <InvoiceItem>
                <LineId>1</LineId>
                <Cd>123456</Cd>
                <Description>Item 1</Description>
                <Quantity>1</Quantity>
                <UnitPrice>99.990000</UnitPrice>
            </InvoiceItem>
            <InvoiceItem>
                <LineId>2</LineId>
                <Cd>234567</Cd>
                <Description>Item 2</Description>
                <Quantity>1</Quantity>
                <UnitPrice>89.990000</UnitPrice>
            </InvoiceItem>
        </InvoiceItems>
    </InvoiceDetail>
    <InvoiceDetail>
        <OrderId>1200000</OrderId>
        <OrderTypeId>1</OrderTypeId>
        <Id>3000</Id>
        <InvoiceItems>
            <InvoiceItem>
                <LineId>1</LineId>
                <Cd>234567</Cd>
                <Description>Item 2</Description>
                <Quantity>1</Quantity>
                <UnitPrice>89.990000</UnitPrice>
            </InvoiceItem>
            <InvoiceItem>
                <LineId>2</LineId>
                <Cd>345678</Cd>
                <Description>Item 3</Description>
                <Quantity>1</Quantity>
                <UnitPrice>79.990000</UnitPrice>
            </InvoiceItem>
        </InvoiceItems>
    </InvoiceDetail>
</ROOT>'

SELECT 
      Invoices.Node.value('@OrderId', 'VARCHAR(10)') 'OrderID'
    , Invoices.Node.value('@Id', 'INT') 'InvoiceId'
    , Items.Cd.value('.', 'VARCHAR(14)') 'ItemId'
FROM 
    @doc.nodes('//InvoiceDetail') Invoices(Node)
    CROSS APPLY Invoices.Node.nodes('./InvoiceItems/InvoiceItem/Cd') Items(Cd)

我得到以下结果:

NULL    NULL    123456
NULL    NULL    234567
NULL    NULL    234567
NULL    NULL    345678

我正在尝试获取以下内容:

1000000 2000    123456
1000000 2000    234567
1200000 3000    234567
1200000 3000    345678

我做错了什么?

最佳答案

抓取元素的语法是:

SELECT Invoices.Node.value('(OrderId)[1]', 'VARCHAR(10)') 'OrderID'
    , Invoices.Node.value('(Id)[1]', 'INT') 'InvoiceId'
    , Items.Cd.value('.', 'VARCHAR(14)') 'ItemId'
FROM 
    @doc.nodes('//InvoiceDetail') Invoices(Node)
    CROSS APPLY Invoices.Node.nodes('./InvoiceItems/InvoiceItem/Cd') Items(Cd)

这似乎也可以在没有显式括号的情况下工作:

Invoices.Node.value('OrderId[1]', 'VARCHAR(10)') 
<小时/>

@ 语法适用于属性,而不适用于 XQuery 中的元素。如果你有

<InvoiceDetail title="something">

然后您可以使用以下方式查询:

SELECT Invoices.Node.value('@title', 'VARCHAR(MAX)') AS Title
FROM @doc.nodes('//InvoiceDetail') Invoices(Node)

这是一篇关于使用 XQuery value 的好文章

关于sql-server - 在 SQL Server 中选择 XML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12963951/

相关文章:

SQL Server XQuery 错误 : A node or set of nodes is required for number()

php - PHP 面向对象编程中的困惑

c# - MSBuild - XPath - XmlPeek 可以读取但 XmlPoke 不能写入

sql - "Stored Procedure has too many arguments specified"SQL服务器

python - 使用 Selenium/Python 的 CSS 选择器中的 OR 条件

xslt - for-each 的每次迭代都会增加 XSL 谓词

marklogic - 使用 xquery 和 xdmp 更新 xml 中的多个节点 :node-replace

java - 用什么?将前端 Web 应用程序与 XQuery/Saxon 作为平台集成?

sql-server - 根据另一列更新列

sql - 检查两列之间的一对一关系