SQL - FOR XML - Размещение почти одинаковых элементов рядом друг с другом - PullRequest
1 голос
/ 17 октября 2019

У меня есть хранимая процедура для создания документа XML на основе стандарта UBL-TR-2.1. Я только что узнал, как добавить атрибуты (т.е. schemeID="VKN") к элементу внутри моего запроса. Теперь у меня другая проблема:

Стандарт UBL-TR-2.1 определяет 3 раза cac:PartyIdentification с cbc:ID, но разными schemeID атрибутами, как вы можете видеть здесь:

...
<cac:PartyIdentification>
   <cbc:ID schemeID="VKN">1190538652</cbc:ID>
</cac:PartyIdentification>
<cac:PartyIdentification>
   <cbc:ID schemeID="TICARETSICILNO">622171</cbc:ID>
</cac:PartyIdentification>
<cac:PartyIdentification>
   <cbc:ID schemeID="MERSISNO">0119053865200011</cbc:ID>
</cac:PartyIdentification>
...

Итак, я попробовал это в своем sql запросе (я публикую только соответствующие части запроса):

SELECT
    @XMLData = xmldat.xmldataCol 
FROM
(
    SELECT
        (

        SELECT
            ....
            'VKN'               as 'cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification/cbc:ID/@schemeID',
            v2.TAXNRM           as 'cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification/cbc:ID',
            'TICARETSICILNO'    as 'cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification/cbc:ID/@schemeID',
            '622171'            as 'cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification/cbc:ID',
            'MERSISNO'          as 'cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification/cbc:ID/@schemeID',
            '0119053865200011'  as 'cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification/cbc:ID',
            ...
        FROM 
            vorgang2 (nolock) v2
        FOR XML PATH('') , ROOT('Invoice') 
    ) as xmldataCol
) as xmldat

Но это выдает ошибку (здесь оригинальное сообщение на немецком языке):

Сообщение 6852, Уровень 16, Состояние 1, Процедура sp_RTIR_TR_Export_to_XML, Строка 85 [Стартовая строка Строка 7] Die attributzentrierte cac: AccountingSupplierParty / cac: Сторона / cac: PartyIdentification / cbc: ID / @ circuitID-Spalte darf inXML-иерархия в FOR XML PATH nicht auf ein nicht attributzentriertes gleichgeordnetes Element folgen.

В английском это примерно так:

Msg 6852, Уровень 16, Состояние 1, Процедура sp_RTIR_TR_Export_to_XML, Строка 85 [Стартовая Строка 7 Строка] Атрибут, которому доверяют, cac: AccountingSupplierParty / cac: Party / cac: PartyIdentification / cbc: ID / @ схема ID столбца в иерархии XML в FOR XML PATH не долженследуйте родительскому элементу, не являющемуся доверенным атрибутом.

Таким образом, проблема заключается в том, что элементы почти одинаковы. И тут возникла проблема с размещением их рядом друг с другом. Есть ли решение этой проблемы? Заранее большое спасибо!

ОБНОВЛЕНИЕ

Решение с добавлением null между ними не работает должным образом, потому что я получаю этот результат в xml:

<cac:AccountingSupplierParty>
   <cac:Party>
      <cac:PartyIdentification>
         <cbc:ID schemeID="VKN"/>
      </cac:PartyIdentification>
   </cac:Party>
</cac:AccountingSupplierParty>
<cac:AccountingSupplierParty>
   <cac:Party>
      <cac:PartyIdentification>
         <cbc:ID schemeID="TICARETSICILNO">622171</cbc:ID>
      </cac:PartyIdentification>
   </cac:Party>
</cac:AccountingSupplierParty>
<cac:AccountingSupplierParty>
   <cac:Party>
      <cac:PartyIdentification>
         <cbc:ID schemeID="MERSISNO">0119053865200011</cbc:ID>
      </cac:PartyIdentification>
   </cac:Party>
</cac:AccountingSupplierParty>

Элементы <cac:AccountingSupplierParty> и <cac:Party> не должны повторяться. Структура должна быть такой:

<cac:AccountingSupplierParty>
   <cac:Party>
      ...
      <cac:PartyIdentification>
         <cbc:ID schemeID="VKN">1190538652</cbc:ID>
      </cac:PartyIdentification>
      <cac:PartyIdentification>
         <cbc:ID schemeID="TICARETSICILNO">622171</cbc:ID>
      </cac:PartyIdentification>
      <cac:PartyIdentification>
         <cbc:ID schemeID="MERSISNO">0119053865200011</cbc:ID>
      </cac:PartyIdentification>
      ...
   </cac:Party>
</cac:AccountingSupplierParty>

1 Ответ

2 голосов
/ 17 октября 2019

вам нужно отделить его с пустым именем столбца. определить его неограниченные строки.

        SELECT      
            (SELECT            
                'VKN'               as 'cac:PartyIdentification/cbc:ID/@schemeID',
                 v3.TAXNRM        as 'cac:PartyIdentification/cbc:ID',
                null,
                'TICARETSICILNO'    as 'cac:PartyIdentification/cbc:ID/@schemeID',
                '622171'            as 'cac:PartyIdentification/cbc:ID',
                null,
                'MERSISNO'          as 'cac:PartyIdentification/cbc:ID/@schemeID',
                '0119053865200011'  as 'cac:PartyIdentification/cbc:ID'

             FROM 
             vorgang2(nolock) v3 
             WHERE v3.pk = v2.pk FOR XML path('cac:Party')
                    ,root('cac:AccountingSupplierParty')
                    ,type)

        FROM 
            vorgang2(nolock) v2

        FOR XML PATH('') , ROOT('Invoice') 

вывод:

enter image description here

...