jar*_*red 9 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)
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
NULL NULL 123456
NULL NULL 234567
NULL NULL 234567
NULL NULL 345678
Run Code Online (Sandbox Code Playgroud)
我想要得到以下内容:
1000000 2000 123456
1000000 2000 234567
1200000 3000 234567
1200000 3000 345678
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
抓取元素的语法是:
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)
Run Code Online (Sandbox Code Playgroud)
这似乎也没有明确的括号:
Invoices.Node.value('OrderId[1]', 'VARCHAR(10)')
Run Code Online (Sandbox Code Playgroud)
该@语法是属性,XQuery中没有的元素.如果你有
<InvoiceDetail title="something">
Run Code Online (Sandbox Code Playgroud)
然后你就可以使用以下方法查询:
SELECT Invoices.Node.value('@title', 'VARCHAR(MAX)') AS Title
FROM @doc.nodes('//InvoiceDetail') Invoices(Node)
Run Code Online (Sandbox Code Playgroud)
这是一篇关于使用XQuery值的好文章
| 归档时间: |
|
| 查看次数: |
15200 次 |
| 最近记录: |