通过OPENROWSET计算SQL / XML导入中的项目

时间:2013-08-12 13:20:57

标签: sql-server xml tsql

我从SQL Server 2012中的XML文件导入。 所有工作,但以下问题: 在XML文件中有两个项目(或更多或更少),并且posid(posnummer)对于第一个项目设置为“1”。对于第二个项目,我搜索一个解决方案,PosId增加为'1',如: “设置@Posnummer = @Posnummer + 1” 我找不到可以插入此代码的地方。

以下是代码:

DECLARE @bt varchar(30) = 'F';
DECLARE @Posnummer int = 1;
DECLARE @CurrentCustNo varchar(30) = '1006';

  insert into BELEGP(Kennung, Belegtyp, Belegnummer, Posnummer, Postext, Menge,     Eingabemenge, Editmenge, Artikelnummer, Bezeichnung, Preismenge, Einzelpreis, Gesamtpreis, Netto, Adressnr)

   SELECT  NEWID() as Kennung,
       @bt as Belegtyp,
       Myorder.j.value('OrderNumber[1]', 'varchar(50)') as Belegnummer,
       @Posnummer as  Posnummer,
       @Posnummer as  Postext,
       MyItem.j.value('Quantity[1]', 'varchar(50)') as Menge,
       MyItem.j.value('Quantity[1]', 'varchar(50)') as Eingabemenge,
       MyItem.j.value('Quantity[1]', 'varchar(50)') as Editmenge,
       MyItem.j.value('Id[1]', 'varchar(50)') as Artikelnummer,
       MyItem.j.value('Name[1]', 'varchar(50)') as Bezeichnung,
       MyItem.j.value('TotalPrice[1]', 'varchar(50)') as Preismenge,
       MyItem.j.value('TotalPrice[1]', 'varchar(50)') as Einzelpreis,
       MyItem.j.value('TotalPrice[1]', 'varchar(50)') as Gesamtpreis,
       MyItem.j.value('UnityPrice[1]', 'varchar(50)') as Netto,
       @CurrentCustNo as Adressnr

 FROM (
 SELECT CAST(x AS XML)
 FROM
 OPENROWSET( BULK 'D:\shop\xml\Bestellungen.xml',SINGLE_BLOB) AS k(x))
 AS k(x)
 CROSS APPLY x.nodes('Orders/Order') AS MYorder(j)
 CROSS APPLY x.nodes('Orders/Order/Addresses/BillingAddress') AS MYAddresses(j)
 CROSS APPLY x.nodes('Orders/Order/LineItems/LineItem') AS MYItem(j)

我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

替换

@Posnummer as  Posnummer,
@Posnummer as  Postext,

ROW_NUMBER() OVER (ORDER BY Myorder.j.value('OrderNumber[1]', 'varchar(50)')) as  Posnummer,
ROW_NUMBER() OVER (ORDER BY Myorder.j.value('OrderNumber[1]', 'varchar(50)')) as  Postext,

我不知道OrderNumber[1]每条记录是否唯一。如果没有,请尝试在ORDER BY表达式中找到要使用的唯一组合。