[英]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
.我需要E1EDKA1
和E1EDK02
的所有重复元素的一些属性。
If I set my XPath to如果我将我的 XPath 设置为
@XML.nodes('//*:ZINVOIC2/*:IDOC/*:E1EDKA1')
I am able to access elements of E1EDKA1
and E1EDK01
.我能够访问E1EDKA1
和E1EDK01
的元素。 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.