如何将 XML 文件导入到 XML 中带有重复标签的 MSSQL
How to import XML file into MSSQL with duplicate tags in the XML
我有一个销售 XML 文件,其中每个销售都如下所示:
<Sale>
<Store>2725</Store>
<Station>2</Station>
<Date>01/03/2015 14:23:24</Date>
<SaleType>12</SaleType>
<SaleNumber>9213</SaleNumber>
<Tot>1060.00</Tot>
<LnQnt>2</LnQnt>
<Lines>
<Line>
<Code>20</Code>
<Price>480.00</Price>
<Qnt>1</Qnt>
<LnTot>480.00</LnTot>
</Line>
<Line>
<Code>20</Code>
<Price>580.00</Price>
<Qnt>1</Qnt>
<LnTot>580.00</LnTot>
</Line>
</Lines>
<payments>
<PayQnt>2</PayQnt>
<Pay>1^ 500.00^</Pay>
<Pay>4^ 560.00^</Pay>
</payments>
</Sale>
我使用以下语法导入付款数据:
DECLARE @InputXML XML
SELECT @InputXML = CAST(x AS XML)
FROM OPENROWSET(BULK 'C:\Temp\Sales.xml', SINGLE_BLOB) AS T(x)
INSERT INTO temp_sales_payments
SELECT row.value('(../Store)[1]', 'NVARCHAR(255)') Store
,row.value('(../Station)[1]', 'int') Station
,row.value('(../Date)[1]', 'NVARCHAR(255)') Date
,row.value('(../SaleType)[1]', 'int') SaleType
,row.value('(../SaleNumber)[1]', 'int') SaleNumber
,row.value('(PayQnt)[1]', 'int') PayQnt
,row.value('(Pay)[1]', 'NVARCHAR(255)') Pay
FROM @InputXML.nodes('Sales/Sale/payments') AS X(row);
只要有一个标签,一切正常,但当有2个或更多标签时,如示例数据,只导入第一笔付款。
我们将不胜感激任何帮助。
谢谢,吉拉德
您的示例 XML 与您的节点查询不匹配,它在 XML 中缺少 "Sales",所以我不得不修改那部分查询。
SELECT xmlData.a.value('(../Store)[1]', 'NVARCHAR(255)') AS Store
,xmlData.a.value('(../Station)[1]', 'int') AS Station
,xmlData.a.value('(../Date)[1]', 'NVARCHAR(255)') AS Date
,xmlData.a.value('(../SaleType)[1]', 'int') AS SaleType
,xmlData.a.value('(../SaleNumber)[1]', 'int') AS SaleNumber
,xmlData.a.value('(PayQnt)[1]', 'int') AS PayQnt
,xmld.b.value('.', 'NVARCHAR(255)') AS Pay
FROM @InputXML.nodes('Sale/payments') xmlData(a)
CROSS APPLY XMLDATA.a.nodes('Pay') AS xmld(b)
我有一个销售 XML 文件,其中每个销售都如下所示:
<Sale>
<Store>2725</Store>
<Station>2</Station>
<Date>01/03/2015 14:23:24</Date>
<SaleType>12</SaleType>
<SaleNumber>9213</SaleNumber>
<Tot>1060.00</Tot>
<LnQnt>2</LnQnt>
<Lines>
<Line>
<Code>20</Code>
<Price>480.00</Price>
<Qnt>1</Qnt>
<LnTot>480.00</LnTot>
</Line>
<Line>
<Code>20</Code>
<Price>580.00</Price>
<Qnt>1</Qnt>
<LnTot>580.00</LnTot>
</Line>
</Lines>
<payments>
<PayQnt>2</PayQnt>
<Pay>1^ 500.00^</Pay>
<Pay>4^ 560.00^</Pay>
</payments>
</Sale>
我使用以下语法导入付款数据:
DECLARE @InputXML XML
SELECT @InputXML = CAST(x AS XML)
FROM OPENROWSET(BULK 'C:\Temp\Sales.xml', SINGLE_BLOB) AS T(x)
INSERT INTO temp_sales_payments
SELECT row.value('(../Store)[1]', 'NVARCHAR(255)') Store
,row.value('(../Station)[1]', 'int') Station
,row.value('(../Date)[1]', 'NVARCHAR(255)') Date
,row.value('(../SaleType)[1]', 'int') SaleType
,row.value('(../SaleNumber)[1]', 'int') SaleNumber
,row.value('(PayQnt)[1]', 'int') PayQnt
,row.value('(Pay)[1]', 'NVARCHAR(255)') Pay
FROM @InputXML.nodes('Sales/Sale/payments') AS X(row);
只要有一个标签,一切正常,但当有2个或更多标签时,如示例数据,只导入第一笔付款。
我们将不胜感激任何帮助。
谢谢,吉拉德
您的示例 XML 与您的节点查询不匹配,它在 XML 中缺少 "Sales",所以我不得不修改那部分查询。
SELECT xmlData.a.value('(../Store)[1]', 'NVARCHAR(255)') AS Store
,xmlData.a.value('(../Station)[1]', 'int') AS Station
,xmlData.a.value('(../Date)[1]', 'NVARCHAR(255)') AS Date
,xmlData.a.value('(../SaleType)[1]', 'int') AS SaleType
,xmlData.a.value('(../SaleNumber)[1]', 'int') AS SaleNumber
,xmlData.a.value('(PayQnt)[1]', 'int') AS PayQnt
,xmld.b.value('.', 'NVARCHAR(255)') AS Pay
FROM @InputXML.nodes('Sale/payments') xmlData(a)
CROSS APPLY XMLDATA.a.nodes('Pay') AS xmld(b)