微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试用 SQL 连接 XML 元素

如何解决尝试用 SQL 连接 XML 元素

我有以下查询

RDBMS 是 Windows 10 Enterprise 10.0 上的 Microsoft sql Server 2019 Developer Edition(64 位)

我正在尝试使用 sql 连接 XML 元素,但没有成功。

我想将 custom_rules 元素的所有节点与其位于 XML 底部的翻译连接起来。

连接基于与元素 Captions 的元素 ID 匹配的 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

结果是

(无列名) 标题
e7d23139-6880-41b0-b8c6-22212a510108 NULL
491bfdbc-58ab-41c7-8915-d94a51b55d26 NULL

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。