У меня следующий запрос.

СУБД - это Microsoft SQL Server 2019 Developer Edition (64-разрядная версия) в Windows 10 Enterprise 10.0.

Я безуспешно пытаюсь соединить элементы XML с помощью SQL. Я хочу, чтобы все узлы элемента custom_rules были соединены с их переводами, которые находятся в нижней части XML. Объединение основано на атрибуте CustomRule CGID, который соответствует идентификатору элемента в заголовках элементов. Когда я выполняю соединение, объединенный столбец возвращает Null.

      declare @xml as xml = N'
            <BRDatasetNode RootNodeType="Entersoft.Framework.Platform.CustomCommands.BRDatasetNode, ESCustomNode" Version="2" CGID="42d7a588-adb7-4bf1-8ed0-fdefe8038267" Dataset="ESGOPerson">
              <system_rules CGID="beeeb555-749a-411d-8021-5ef9d521ad8e" />
              <custom_rules CGID="13758bd2-68c0-4f52-b78e-80825016c77b">
                <CustomRule CGID="e7d23139-6880-41b0-b8c6-22212a510108" use_case="bf5c89d2-93d9-4ea7-858f-bba9fdf0d957">
                </CustomRule>
                <CustomRule CGID="491bfdbc-58ab-41c7-8915-d94a51b55d26">
                </CustomRule>
              </custom_rules>
              <Translations>
                <ESCaptionsDS>
              <Captions>
                <ID>e7d23139-6880-41b0-b8c6-22212a510108</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Κανόνες για επωφελούμενα πρόσωπα</Caption>
              </Captions>
              <Captions>
                <ID>491bfdbc-58ab-41c7-8915-d94a51b55d26</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Ανάθεση Ημ/νίας εγγραφής</Caption>
              </Captions>
            </ESCaptionsDS>
              </Translations>
            </BRDatasetNode>'
            
            
                       SELECT
                CAST(u.n.value('@CGID', 'varchar(max)') AS varchar(max)) , zz.Caption 
            FROM
                @xml.nodes('/BRDatasetNode/custom_rules/CustomRule') AS u (n)       
                cross apply (
                SELECT
                CAST(u.n.value('Caption[1]', 'varchar(max)') AS varchar(max)) as Caption
                FROM
                @xml.nodes('/BRDatasetNode/Translations/ESCaptionsDS/Captions') AS z (n) 
                where convert( nvarchar(max), z.n.value('ID[1]', 'nvarchar(max)'))  = convert( nvarchar(max), u.n.value('./@CGID', 'nvarchar(max)'))
                ) as zz
    
    ```
    
The result is 
    
    |(No column name)                     |  Caption|
    |:------------------------------------|--------:|
    |e7d23139-6880-41b0-b8c6-22212a510108 | NULL    |
    |491bfdbc-58ab-41c7-8915-d94a51b55d26 | NULL    |
1
Ted Kon 4 Май 2021 в 02:11

1 ответ

Лучший ответ

Попробуйте следующее решение для MS SQL Server.

Он использует XQuery и его выражение FLWOR для соединения.

Фактическое соединение реализовано для двух последовательностей: $x и $y.

CTE возвращает соответствующие элементы <Captions>.

SQL

DECLARE @xml XML = 
N'<BRDatasetNode RootNodeType="Entersoft.Framework.Platform.CustomCommands.BRDatasetNode, ESCustomNode"
               Version="2" CGID="42d7a588-adb7-4bf1-8ed0-fdefe8038267"
               Dataset="ESGOPerson">
    <system_rules CGID="beeeb555-749a-411d-8021-5ef9d521ad8e"/>
    <custom_rules CGID="13758bd2-68c0-4f52-b78e-80825016c77b">
        <CustomRule CGID="e7d23139-6880-41b0-b8c6-22212a510108"
                    use_case="bf5c89d2-93d9-4ea7-858f-bba9fdf0d957">
        </CustomRule>
        <CustomRule CGID="491bfdbc-58ab-41c7-8915-d94a51b55d26">
        </CustomRule>
        <CustomRule CGID="577f5ec8-5058-490a-98b4-f87b663f3b67">
        </CustomRule>
        <CustomRule CGID="70e93dee-051f-40fd-bbb1-b60d084e0cb0">
        </CustomRule>
    </custom_rules>
    <Translations>
        <ESCaptionsDS>
            <Captions>
                <ID>e7d23139-6880-41b0-b8c6-22212a510108</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Κανόνες για επωφελούμενα πρόσωπα</Caption>
            </Captions>
            <Captions>
                <ID>ffeee6da-5239-484a-b701-ce9d1ab7b05f</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Κανόνες για επωφελούμενα πρόσωπα</Caption>
            </Captions>
            <Captions>
                <ID>8bae1ba8-e6ed-4e0a-b02d-1f3e73034801</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Ανάθεση πεδίων κατά την επισύναψη εγγράφου</Caption>
            </Captions>
            <Captions>
                <ID>b85f3890-bcd9-43a4-8619-a061a97c9747</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Ανάθεση πεδίων κατά την επισύναψη εγγράφου</Caption>
            </Captions>
            <Captions>
                <ID>722e1fce-8d04-4f61-9272-e31bce9f984f</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Maximum Entries</Caption>
            </Captions>
            <Captions>
                <ID>1c614046-c7c5-4dd3-87d0-dabec01c15ab</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Ενημέρωση χαρακτηρισμού ανήλικος</Caption>
            </Captions>
            <Captions>
                <ID>09436c79-3bf0-4c46-80fb-93a20e1e7924</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Ενημέρωση χαρακτηρισμού ανήλικος</Caption>
            </Captions>
            <Captions>
                <ID>d9575b83-fa08-4022-a54a-7633ea802fc0</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Maximum Entries</Caption>
            </Captions>
            <Captions>
                <ID>ad7e28a5-3366-4487-bc99-06b018e29609</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Έλεγχος συμπλήρωσης Φορέα</Caption>
            </Captions>
            <Captions>
                <ID>23c54352-3496-45f4-9551-45f7a29056f0</ID>
                <Suffix>Message</Suffix>
                <LangID>el</LangID>
                <Caption>Παρακαλώ συμπληρώστε Φορέα.</Caption>
            </Captions>
            <Captions>
                <ID>a0903e5a-dc7b-40d7-bef1-ada1af724243</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Κανόνες για επωφελούμενα πρόσωπα</Caption>
            </Captions>
            <Captions>
                <ID>491bfdbc-58ab-41c7-8915-d94a51b55d26</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Ανάθεση Ημ/νίας εγγραφής</Caption>
            </Captions>
            <Captions>
                <ID>96c844ac-41be-4fe1-8c54-360c830351f1</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Ανάθεση Ημ/νίας εγγραφής</Caption>
            </Captions>
            <Captions>
                <ID>0c08d413-0c08-4bb5-96a7-93322fdfd955</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Ανάθεση Ημ/νίας εγγραφής</Caption>
            </Captions>
            <Captions>
                <ID>9cab91d1-202d-490e-8ee2-4fee30db56d2</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Ανάθεση Ημ/νίας εγγραφής</Caption>
            </Captions>
            <Captions>
                <ID>9a865e63-0605-49a3-aa03-08504831e136</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Maximum Entries</Caption>
            </Captions>
            <Captions>
                <ID>65f75065-376d-40f8-9b2a-733bcc597247</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Ανάθεση Ημ/νίας εγγραφής</Caption>
            </Captions>
            <Captions>
                <ID>577f5ec8-5058-490a-98b4-f87b663f3b67</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Έλεγχος συμπλήρωσης ΑΦΜ</Caption>
            </Captions>
            <Captions>
                <ID>91702e0f-3f55-412d-9cde-c0161d7cfcbf</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Έλεγχος συμπλήρωσης ΑΦΜ</Caption>
            </Captions>
            <Captions>
                <ID>5660b621-c7d8-41bf-9526-a880e89e2e09</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Έλεγχος συμπλήρωσης ΑΦΜ</Caption>
            </Captions>
            <Captions>
                <ID>96adc51f-177a-41a5-ba95-6ebd3f96d25a</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Έλεγχος συμπλήρωσης ΑΦΜ</Caption>
            </Captions>
            <Captions>
                <ID>cecb7870-898f-42bf-a3a0-4d436e72c64b</ID>
                <Suffix>Message</Suffix>
                <LangID>el</LangID>
                <Caption>Παρακαλώ συμπληρώστε ΑΦΜ</Caption>
            </Captions>
            <Captions>
                <ID>5c833d3e-00c9-4f5e-a8b3-3ba533a20a31</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Έλεγχος συμπλήρωσης ΑΦΜ</Caption>
            </Captions>
            <Captions>
                <ID>70e93dee-051f-40fd-bbb1-b60d084e0cb0</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Έλεγχος στοιχείων καταχώρησης</Caption>
            </Captions>
            <Captions>
                <ID>cfdf614e-0835-425e-ab79-870db327fafa</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Ανάθεση Ημ/νίας εγγραφής</Caption>
            </Captions>
            <Captions>
                <ID>ac617fca-5fd3-47d1-909f-131bfb8c7d58</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Έλεγχος στοιχείων καταχώρησης</Caption>
            </Captions>
            <Captions>
                <ID>787963fb-304f-4e60-a3b5-0fde2de50ece</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Ανάθεση Ημ/νίας εγγραφής</Caption>
            </Captions>
            <Captions>
                <ID>66bc1cd4-a7e2-47e1-b4b9-76276c73480c</ID>
                <Suffix>Message</Suffix>
                <LangID>el</LangID>
                <Caption>Δεν έχετε συμπληρώσει όλα τα πεδία (Επώνυμο, Όνομα, Φύλο, Ημ/νία γέννησης, Αριθμός εγγράφου)</Caption>
            </Captions>
            <Captions>
                <ID>512b35f8-3190-493c-b680-ac8caf713fcb</ID>
                <Suffix>Title</Suffix>
                <LangID>el</LangID>
                <Caption>Ανάθεση Ημ/νίας εγγραφής</Caption>
            </Captions>
        </ESCaptionsDS>
    </Translations>
</BRDatasetNode>';

;WITH rs (xmldata) AS
(
    SELECT @xml.query('
       for $x in /BRDatasetNode/custom_rules/CustomRule/@CGID,
          $y in /BRDatasetNode/Translations/ESCaptionsDS/Captions/ID/text()
       where lower-case($y) eq lower-case($x)
       return /BRDatasetNode/Translations/ESCaptionsDS/Captions[ID/text() = $y]
    ')
)
SELECT c.value('(ID/text())[1]', 'UNIQUEIDENTIFIER') AS ID
    , c.value('(Caption/text())[1]', 'NVARCHAR(100)') AS Caption
FROM rs CROSS APPLY xmldata.nodes('/Captions') AS t(c);

Вывод

+--------------------------------------+----------------------------------+
|                  ID                  |             Caption              |
+--------------------------------------+----------------------------------+
| E7D23139-6880-41B0-B8C6-22212A510108 | Κανόνες για επωφελούμενα πρόσωπα |
| 491BFDBC-58AB-41C7-8915-D94A51B55D26 | Ανάθεση Ημ/νίας εγγραφής         |
| 577F5EC8-5058-490A-98B4-F87B663F3B67 | Έλεγχος συμπλήρωσης ΑΦΜ          |
| 70E93DEE-051F-40FD-BBB1-B60D084E0CB0 | Έλεγχος στοιχείων καταχώρησης    |
+--------------------------------------+----------------------------------+
0
Yitzhak Khabinsky 4 Май 2021 в 00:32