简体   繁体   English

SQL服务器中的Xquery

[英]Xquery in SQL Server

I am trying to parse my XML elements for the XML shown here.我正在尝试为此处显示的 XML 解析我的 XML 元素。 I need different elements from hierarchy.我需要层次结构中的不同元素。

I needs some attributes of all repeated elements of E1EDKA1 and E1EDK02 .我需要E1EDKA1E1EDK02的所有重复元素的一些属性。

If I set my XPath to如果我将我的 XPath 设置为

@XML.nodes('//*:ZINVOIC2/*:IDOC/*:E1EDKA1')

I am able to access elements of E1EDKA1 and E1EDK01 .我能够访问E1EDKA1E1EDK01的元素。 But I have multiple elements of E1EDK02.QUALF .但是我有E1EDK02.QUALF的多个元素。 How can I get all records of E1EDK02.QUALF in separate rows?如何在单独的行中获取E1EDK02.QUALF的所有记录?

Code for this is代码是

SELECT 
t.c.query('E1EDK01/BELNR').value('.','char(15)') as INV_NO,
 t.c.query('E1EDKA1/PARVW').value('.','char(10)') as CUST_NO,
 t.c.query('E1EDKA1/NAME1').value('.','char(50)') as CUST_NAME,
 t.c.query('E1EDK02/QUALF').value('.','char(50)') as QUALF
FROM @XML.nodes('//*:ZINVOIC2/*:IDOC') t(c);

How should I fix this.我该如何解决这个问题。 I have multiple such attributes and don't want to create different queries for each and then join back the result.我有多个这样的属性,不想为每个创建不同的查询,然后返回结果。

 <ZINVOIC2>
  <IDOC BEGIN="1">
    <EDI_DC40 SEGMENT="1">
      <TABNAM>EDI_DC40</TABNAM>
      <MANDT>100</MANDT>
      <DOCNUM>0000022222017973</DOCNUM>
       </EDI_DC40>
    <!--header general data information-->
    <E1EDK01 SEGMENT="1">
      <CURCY>GBP</CURCY>
      <HWAER>GBP</HWAER>
      <BELNR>9650019904</BELNR>
      <FKTYP>L</FKTYP>
      <Z1EDK01 SEGMENT="1">
        <TAXID>37-1652702</TAXID>
      </Z1EDK01>
      <Z1INCO SEGMENT="1">
        <INCO1>EXW</INCO1>
        <INCO1_TXT>Ex Works</INCO1_TXT>
      </Z1INCO>
      <ZINVREF SEGMENT="1">
        <ZNETDT>20220125</ZNETDT>
        <ZDSDT1>20220125</ZDSDT1>
        <DISCOUNTDUE>12427.39</DISCOUNTDUE>
        <SFAKN>N</SFAKN>
        <KALSM>YIS001</KALSM>
        <ZCONTACT_NUM>01542 832327</ZCONTACT_NUM>
        <FKART>YRIN</FKART>
        <KNUMV>0008498319</KNUMV>
        <VBTYP>M</VBTYP>
        <BEZEI>Ex Works</BEZEI>
        <KSCHL>ZMP6</KSCHL>
      </ZINVREF>
    </E1EDK01>
    <E1EDKA1 SEGMENT="1">
      <PARVW>RS</PARVW>
      <LIFNR>1111164896</LIFNR>
      <NAME1>XYZ Company</NAME1>
      <NAME2>XYZ Company Limited</NAME2>
      <STRAS>Sugarland str</STRAS>
      <ORT01>LONDON</ORT01>
      <PSTLZ>EC1A 4HD</PSTLZ>
      <LAND1>GB</LAND1>
      <SPRAS>E</SPRAS>
      <BNAME>PRODERP</BNAME>
      <PAORG>MK40</PAORG>
    </E1EDKA1>
    <E1EDKA1 SEGMENT="1">
      <PARVW>AG</PARVW>
      <PARTN>1111164896</PARTN>
      <NAME1>OILS LTD</NAME1>
      <STRAS>MARINE PLACE</STRAS>
      <ORT01>BUCKIE</ORT01>
      <PSTLZ>AB56 1UT</PSTLZ>
      <LAND1>GB</LAND1>
      <TELF1>01542 832327</TELF1>
      <TELFX>01542 833319</TELFX>
      <SPRAS>E</SPRAS>
      <REGIO>MR</REGIO>
      <SPRAS_ISO>EN</SPRAS_ISO>
    </E1EDKA1>
    <E1EDKA1 SEGMENT="1">
      <PARVW>RE</PARVW>
      <PARTN>1111164896</PARTN>
      <NAME1>OILS LTD</NAME1>
      <STRAS>MARINE PLACE</STRAS>
      <ORT01>BUCKIE</ORT01>
      <PSTLZ>AB56 1UT</PSTLZ>
      <LAND1>GB</LAND1>
      <TELF1>01542 832327</TELF1>
      <TELFX>01542 833319</TELFX>
      <SPRAS>E</SPRAS>
      <REGIO>MR</REGIO>
      <SPRAS_ISO>EN</SPRAS_ISO>
    </E1EDKA1>
    <E1EDKA1 SEGMENT="1">
      <PARVW>RG</PARVW>
      <PARTN>1111164896</PARTN>
      <NAME1>OILS LTD</NAME1>
      <STRAS>MARINE PLACE</STRAS>
      <ORT01>BUCKIE</ORT01>
      <PSTLZ>AB56 1UT</PSTLZ>
      <LAND1>GB</LAND1>
      <TELF1>01542 832327</TELF1>
      <TELFX>01542 833319</TELFX>
      <SPRAS>E</SPRAS>
      <REGIO>MR</REGIO>
      <SPRAS_ISO>EN</SPRAS_ISO>
    </E1EDKA1>
    <E1EDKA1 SEGMENT="1">
      <PARVW>BK</PARVW>
      <LIFNR>1040</LIFNR>
      <NAME1>XYZ Mktg Br</NAME1>
      <NAME2>ABC Ltd</NAME2>
      <STRAS>Sugarstreet</STRAS>
      <ORT01>LONDON</ORT01>
      <PSTLZ>EC1A 4HD</PSTLZ>
      <LAND1>GB</LAND1>
    </E1EDKA1>
    <!--header reference data-->
    <E1EDK02 SEGMENT="1">
      <QUALF>009</QUALF>
      <BELNR>9659999904</BELNR>
      <DATUM>20220101</DATUM>
    </E1EDK02>
    <E1EDK02 SEGMENT="1">
      <QUALF>002</QUALF>
      <BELNR>0201555555</BELNR>
      <DATUM>20220120</DATUM>
    </E1EDK02>
    <E1EDK02 SEGMENT="1">
      <QUALF>012</QUALF>
      <BELNR>0082222514</BELNR>
      <DATUM>20210423</DATUM>
    </E1EDK02>
    <E1EDK02 SEGMENT="1">
      <QUALF>017</QUALF>
      <BELNR>9650019904</BELNR>
    </E1EDK02>
    <E1EDK02 SEGMENT="1">
      <QUALF>087</QUALF>
      <BELNR>9650019904</BELNR>
    </E1EDK02>`enter code here`
    <!--date segment-->
    <E1EDK03 SEGMENT="1">
      <IDDAT>026</IDDAT>
      <DATUM>20220120</DATUM>
    </E1EDK03>
    <E1EDK03 SEGMENT="1">
      <IDDAT>001</IDDAT>
      <DATUM>20210423</DATUM>
    </E1EDK03>
    <E1EDK03 SEGMENT="1">
      <IDDAT>012</IDDAT>
      <DATUM>20220120</DATUM>
    </E1EDK03>
    <E1EDK03 SEGMENT="1">
      <IDDAT>011</IDDAT>
      <DATUM>20220120</DATUM>
    </E1EDK03>
    <E1EDK03 SEGMENT="1">
      <IDDAT>024</IDDAT>
      <DATUM>20220101</DATUM>
    </E1EDK03>
    <E1EDK03 SEGMENT="1">
      <IDDAT>028</IDDAT>
      <DATUM>20220115</DATUM>
    </E1EDK03>
    <E1EDK03 SEGMENT="1">
      <IDDAT>048</IDDAT>
      <DATUM>20220101</DATUM>
    </E1EDK03>
    <!--taxes-->
    <E1EDK04 SEGMENT="1">
      <MWSKZ>G1</MWSKZ>
      <MSATZ>20.000</MSATZ>
      <MWSBT>1394.86</MWSBT>
    </E1EDK04>
  </IDOC>
</ZINVOIC2> 

在此处输入图像描述

The E1EDK02/QUALF values determine the nature of the E1EDK02 contents, you can cross apply them against the IDOC element (Intermediate Document) like so... E1EDK02/QUALF值确定E1EDK02内容的性质,您可以像这样将它们交叉应用于IDOC元素(中间文档)...

declare @xml xml =
N'<INVOIC02 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="INVOIC02.xsd">
  <IDOC BEGIN="1">
    <EDI_DC40 SEGMENT="1" />
    <E1EDK02 SEGMENT="1">
      <QUALF>009</QUALF>
      <BELNR>239238232</BELNR>
      <DATUM>20190111</DATUM>
    </E1EDK02>
    <E1EDK02 SEGMENT="1">
      <QUALF>001</QUALF>
      <BELNR>592382323</BELNR>
      <DATUM>20190104</DATUM>
    </E1EDK02>
    <E1EDK02 SEGMENT="1">
      <QUALF>002</QUALF>
      <BELNR>292847342</BELNR>
      <DATUM>20190104</DATUM>
    </E1EDK02>
  </IDOC>
</INVOIC02>';

select
  InvoiceNumber.value('(QUALF/text())[1]', 'varchar(3)') as Invoice_QUALF,
  InvoiceNumber.value('(BELNR/text())[1]', 'varchar(35)') as Invoice_BELNR,
  InvoiceNumber.value('(DATUM/text())[1]', 'date') as Invoice_DATUM,
  InvoiceNumber.value('(UZEIT/text())[1]', 'time') as Invoice_UZEIT,

  CustomerPurchaseOrderNumber.value('(QUALF/text())[1]', 'varchar(3)') as PurchaseOrder_QUALF,
  CustomerPurchaseOrderNumber.value('(BELNR/text())[1]', 'varchar(35)') as PurchaseOrder_BELNR,
  CustomerPurchaseOrderNumber.value('(DATUM/text())[1]', 'date') as PurchaseOrder_DATUM,
  CustomerPurchaseOrderNumber.value('(UZEIT/text())[1]', 'time') as PurchaseOrder_UZEIT,

  SupplierOrderNumber.value('(QUALF/text())[1]', 'varchar(3)') as SupplierOrder_QUALF,
  SupplierOrderNumber.value('(BELNR/text())[1]', 'varchar(35)') as SupplierOrder_BELNR,
  SupplierOrderNumber.value('(DATUM/text())[1]', 'date') as SupplierOrder_DATUM,
  SupplierOrderNumber.value('(UZEIT/text())[1]', 'time') as SupplierOrder_UZEIT

from @xml.nodes('/INVOIC02/IDOC') as IDOC(IntermediateDocument)
cross apply IntermediateDocument.nodes('E1EDK02[QUALF/text()="009"]') E1EDK02_009(InvoiceNumber)
cross apply IntermediateDocument.nodes('E1EDK02[QUALF/text()="001"]') E1EDK02_001(CustomerPurchaseOrderNumber)
cross apply IntermediateDocument.nodes('E1EDK02[QUALF/text()="002"]') E1EDK02_002(SupplierOrderNumber);
Invoice_QUALF发票_QUALF Invoice_BELNR发票_BELNR Invoice_DATUM发票_DATUM Invoice_UZEIT发票_UZEIT PurchaseOrder_QUALF采购订单_QUALF PurchaseOrder_BELNR采购订单_BELNR PurchaseOrder_DATUM采购订单_DATUM PurchaseOrder_UZEIT采购订单_UZEIT SupplierOrder_QUALF供应商订单_QUALF SupplierOrder_BELNR供应商订单_BELNR SupplierOrder_DATUM供应商订单_DATUM SupplierOrder_UZEIT供应商订单_UZEIT
009 009 239238232 239238232 2019-01-11 2019-01-11 null null 001 001 592382323 592382323 2019-01-04 2019-01-04 null null 002 002 292847342 292847342 2019-01-04 2019-01-04 null null

Edit: after example ZINVOIC2 data was provided in the question...编辑:在问题中提供了示例ZINVOIC2数据之后...

The following query will produce the result set that you've asked for, but depending on your goals that result set may not be entirely useful since it is multiplying the iDoc Partner Profile Data against the iDoc Reference Data:以下查询将生成您要求的结果集,但根据您的目标,结果集可能不会完全有用,因为它会将 iDoc 合作伙伴资料数据与 iDoc 参考数据相乘:

select 
  GeneralData.value('(BELNR/text())[1]', 'char(15)') as INV_NO,
  PartnerProfile.value('(PARVW/text())[1]', 'char(10)') as CUST_NO,
  PartnerProfile.value('(NAME1/text())[1]', 'char(50)') as CUST_NAME,
  ReferenceData.value('(QUALF/text())[1]', 'char(50)') as QUALF
from @XML.nodes('/ZINVOIC2/IDOC') IDOC(IntermediateDocument)
cross apply IntermediateDocument.nodes('E1EDK01') E1EDK01(GeneralData)
cross apply IntermediateDocument.nodes('E1EDKA1') E1EDKA1(PartnerProfile)
cross apply IntermediateDocument.nodes('E1EDK02') E1EDK02(ReferenceData)
order by row_number() over (order by ReferenceData, PartnerProfile);
INV_NO INV_NO CUST_NO CUST_NO CUST_NAME CUST_NAME QUALF合格
9650019904 9650019904 RS RS XYZ Company XYZ公司 009 009
9650019904 9650019904 AG股份公司 OILS LTD石油有限公司 009 009
9650019904 9650019904 RE回覆 OILS LTD石油有限公司 009 009
9650019904 9650019904 RG RG OILS LTD石油有限公司 009 009
9650019904 9650019904 BK BK XYZ Mktg Br XYZ Mktg Br 009 009
9650019904 9650019904 RS RS XYZ Company XYZ公司 002 002
9650019904 9650019904 AG股份公司 OILS LTD石油有限公司 002 002
9650019904 9650019904 RE回覆 OILS LTD石油有限公司 002 002
9650019904 9650019904 RG RG OILS LTD石油有限公司 002 002
9650019904 9650019904 BK BK XYZ Mktg Br XYZ Mktg Br 002 002
9650019904 9650019904 RS RS XYZ Company XYZ公司 012 012
9650019904 9650019904 AG股份公司 OILS LTD石油有限公司 012 012
9650019904 9650019904 RE回覆 OILS LTD石油有限公司 012 012
9650019904 9650019904 RG RG OILS LTD石油有限公司 012 012
9650019904 9650019904 BK BK XYZ Mktg Br XYZ Mktg Br 012 012
9650019904 9650019904 RS RS XYZ Company XYZ公司 017 017
9650019904 9650019904 AG股份公司 OILS LTD石油有限公司 017 017
9650019904 9650019904 RE回覆 OILS LTD石油有限公司 017 017
9650019904 9650019904 RG RG OILS LTD石油有限公司 017 017
9650019904 9650019904 BK BK XYZ Mktg Br XYZ Mktg Br 017 017
9650019904 9650019904 RS RS XYZ Company XYZ公司 087 087
9650019904 9650019904 AG股份公司 OILS LTD石油有限公司 087 087
9650019904 9650019904 RE回覆 OILS LTD石油有限公司 087 087
9650019904 9650019904 RG RG OILS LTD石油有限公司 087 087
9650019904 9650019904 BK BK XYZ Mktg Br XYZ Mktg Br 087 087

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM