问题描述
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
结果是
解决方法
请为 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 | Έλεγχος στοιχείων καταχώρησης |
+--------------------------------------+----------------------------------+