【发布时间】:2019-12-05 12:24:33
【问题描述】:
我在从 SQL 生成 XML 文件时遇到问题。
通常它工作正常,但现在的问题是,我想在子查询中显示具有相同名称 <cbc:Note> 的多个节点。
我知道我可以在其间使用null 列强制拆分,但随后会生成一个新的InvoiceLine
原来的查询有1000多行代码,所以我只是贴出数据,这是需要的。
查询以这种方式开始:
WITH XMLNAMESPACES (
'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2' as ext,
'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2' as cbc,
'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2' as cac,
'http://uri.etsi.org/01903/v1.3.2#' as xades,
'http://www.w3.org/2001/XMLSchema-instance' as xsi,
'http://www.w3.org/2000/09/xmldsig#' as ds
)
SELECT
@XMLData = xmldat.xmldataCol
FROM
(
SELECT
(
SELECT
-- HIER XML Daten generieren
'' as 'ext:UBLExtensions',
'' as 'ext:UBLExtensions/ext:UBLExtension',
'' as 'ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent',
'2.1' as 'cbc:UBLVersionID',
'TR1.2' as 'cbc:CustomizationID',
-- evtl. Kommentar für geschart = 1
case
when v2.geschart != 1 then 'IHRACAT'
else '###PROFILE###' end as 'cbc:ProfileID',
'###TRANSACTION_NO###' as 'cbc:ID',
'false' as 'cbc:CopyIndicator',
....
在代码中的某个位置,它会生成多个发票行。
在发票行中,我需要有多个 <cbc:Note> 节点。
这是代码:
...
case when v2.RECINFW = 1 then
cast(v2.kurs as decimal(18,4))
else
null
end as 'cac:PricingExchangeRate/cbc:CalculationRate',
/*
Invoice Lines
| | | | | | | | | | | | | | | | |
v v v v v v v v v v v v v v v v v
*/
(
SELECT
vp2.pos_nr as 'cac:InvoiceLine/cbc:ID',
'PalWeight:' + cast(cast(isnull(vp2.gew_pal,'') as decimal(18,4)) as nvarchar(50)) as 'cbc:Note',
'PackUnit:' + cast(cast(isnull(a.VERP_EIN,'') as decimal(18,4)) as nvarchar(50)) as 'cbc:Note',
case when vp2.DRUCKFLG=4 then cast(isnull(vp2.BEMERK,'') as nvarchar(max)) else null end as 'cbc:Note',
'' as 'cbc:SomeOtherField',
...
FROM
vorgpos2 vp2 (nolock)
inner join
artikel a (nolock) on vp2.ARTKENN = a._KENN
WHERE
vp2.vorgang2 = v2._kenn FOR XML path (''), root('REPLACEINVOICELINEREPLACE'), type
),
当我在 cbc:Notes 列之间放置一个 null 时,
'PalWeight:' + cast(cast(isnull(vp2.gew_pal,'') as decimal(18,4)) as nvarchar(50)) as 'cbc:Note',
null,
'PackUnit:' + cast(cast(isnull(a.VERP_EIN,'') as decimal(18,4)) as nvarchar(50)) as 'cbc:Note',
null,
case when vp2.DRUCKFLG=4 then cast(isnull(vp2.BEMERK,'') as nvarchar(max)) else null end as 'cbc:Note',
它破坏了完整的发票行(停止一个并创建一个新的):
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:Note>PalWeight:1000.0000</cbc:Note>
</cac:InvoiceLine>
<cac:InvoiceLine>
<cbc:Note>PackUnit:25.0000</cbc:Note>
</cac:InvoiceLine>
<cac:InvoiceLine>
<cbc:InvoicedQuantity unitCode="KGM">100.0000</cbc:InvoicedQuantity>
...
想要的结果:
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:Note>PalWeight:1000.0000</cbc:Note>
<cbc:Note>PackUnit:25.0000</cbc:Note>
<cbc:InvoicedQuantity unitCode="KGM">100.0000</cbc:InvoicedQuantity>
...
如果您想知道子查询中缺少 REPLACEINVOICELINEREPLACE 根元素。这是之后更换的。
有没有人提示或解决这个问题?
非常感谢!
【问题讨论】:
-
是发票行存储在一个/单行或发票行是多行:FROM vorgpos2 vp2 (nolock) inner join artikel a (nolock) on vp2.ARTKENN = a._KENN --
-
一行是一个发票行。但可以有多个发票行
标签: sql sql-server xml for-xml-path