尝试将 XML 的元素与 SQL 连接起来

Trying to join elements of XML with SQL

我有以下查询。

RDBMS 是 Microsoft SQL Windows 10 Enterprise 10.0

上的 Server 2019 Developer Edition(64 位)

我正在尝试使用 SQL 加入 XML 个元素,但没有成功。

我想获取 custom_rules 元素的所有节点及其位于 XML 底部的翻译。

连接基于与元素标题的元素 ID 匹配的 CustomRule CGID 属性。

当我加入加入列时 returns 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

结果是

(No column name) Caption
e7d23139-6880-41b0-b8c6-22212a510108 NULL
491bfdbc-58ab-41c7-8915-d94a51b55d26 NULL

请为 MS SQL 服务器尝试以下解决方案。

它正在使用 XQuery 及其 FLWOR 表达式进行连接。

实际连接是针对两个序列实现的:$x$y

CTE returns 相关 <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 | Έλεγχος στοιχείων καταχώρησης    |
+--------------------------------------+----------------------------------+