9

SQL Server 2008 を使用して解析する必要がある XML があります。必要なものを取得するのに近づいていると思いますが、正しい構文がありません (私は信じています)。

私は次のものを持っています:

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

私は何を間違っていますか?

4

2 に答える 2

6

要素を取得するための構文は次のとおりです。

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値の使用に関する良い記事はこちら

于 2012-10-18T21:34:40.347 に答える
0

次の SQL も、データに対して適切に機能します。

--  Iterate through each of the "ROOT\InvoiceDetail" records in our XML
SELECT 
    x.Rec.query('./OrderId').value('.', 'nvarchar(2000)') AS 'OrderID',
    x.Rec.query('./Id').value('.', 'nvarchar(2000)') AS 'ID',
    items.cd.query('./Cd').value('.', 'nvarchar(2000)') AS 'ItemID'
FROM @doc.nodes('/ROOT/InvoiceDetail') as x(Rec)
CROSS APPLY x.Rec.nodes('./InvoiceItems/InvoiceItem') Items(Cd)

これにより、次の結果が得られます。

ここに画像の説明を入力

(構文は不可解ですよね!)

于 2016-09-09T06:57:20.447 に答える