sql-server - 从 SQL Server 2016+ 加入 XML 列
问题描述
我有一个包含此 XMLTABLE_A
的 XML 列:mycategoryXML
<mainxml>
<category id="1" ftype="1"/>
<category id="2" ftype="1"/>
<category id="3" ftype="1"/>
</mainxml>
我还有另一个TABLE_B
名为 XML 的列mymappedids
<mapids>
<ids>
<myid id="1" name="Category Name1"/>
<myid id="2" name="Category Name2"/>
<myid id="3" name="Category Name3"/>
<myid id="4" name="Category Name4"/>
<myid id="5" name="Category Name5"/>
<myid id="6" name="Category Name6"/>
<myid id="7" name="Category Name7"/>
<myid id="8" name="Category Name8"/>
<myid id="9" name="Category Name9"/>
</ids>
</mapids>
是否可以从中选择所有Category
节点TABLE_A
以及每个类别的正确名称table_B
,所以我最终得到以下结果:
id | categoryid | categoryname
---+------------+-------------
1 | 1 | categoryname1
2 | 2 | categoryname2
3 | 3 | categoryname3
来自 SQL Server 的一个查询?
解决方案
有几种方法,但您没有告诉我们足够的背景信息。
特别不清楚:这两个表a和b之间是如何联系的?
你可以试试这个:
模拟您的问题的模型场景(请在下一个问题中自己提供):
DECLARE @tblA TABLE(aId INT,Xml1 XML);
DECLARE @tblB TABLE(bId INT,Xml2 XML);
INSERT INTO @tblA(aId,Xml1) VALUES
(100
,N'<mainxml>
<category id="1" ftype="1"/>
<category id="2" ftype="1"/>
<category id="3" ftype="1"/>
</mainxml>');
INSERT INTO @tblB(bId,Xml2) VALUES
(200
,N'<mapids>
<ids>
<myid id="1" name="Category Name1"/>
<myid id="2" name="Category Name2"/>
<myid id="3" name="Category Name3"/>
<myid id="4" name="Category Name4"/>
<myid id="5" name="Category Name5"/>
<myid id="6" name="Category Name6"/>
<myid id="7" name="Category Name7"/>
<myid id="8" name="Category Name8"/>
<myid id="9" name="Category Name9"/>
</ids>
</mapids>');
--查询
SELECT a.aId
,aXmlValues.*
,(SELECT Xml2.value('(/mapids
/ids
/myid[@id=sql:column("aXmlValues.CategoryId")]
/@name)[1]','nvarchar(max)')
FROM @tblB b
WHERE bID=200 /*however you find this...*/) AS CategoryName
FROM @tblA a
CROSS APPLY a.Xml1.nodes('/mainxml/category') aXml(c)
CROSS APPLY(SELECT aXml.c.value('@id','int') AS CategoryId
,aXml.c.value('@ftype','int') AS CategoryType) aXmlValues;
简而言之:
- 我们使用
APPLY ... .nodes()
在单独的行(派生集)中获取表“a”的类别。 - 现在我们可以
APPLY
再次使用。这是将 XML 的值作为普通列放入结果集中的技巧。 - 可以使用
sql:column()
.
推荐阅读
- mysql - SQL查找另一列具有最大值但可重复值的列的最大值
- python - 如何在 Python 中解析函数的参数?
- html - 如何更改 HTML 表格中特定元素的位置
- r - 错误数据必须是向量类型为空 R
- django - 我将如何对这个以请求为参数的函数进行单元测试?
- xml - XML 文件的 XML 架构定义 (XSD)
- azure - Azure CLI 中的 azure-webapp-maven-plugin 配置不执行
- colors - 如何正确混合两个三角形的颜色并去除对角线拖影
- python - 单击图像以使用 selenium python 访问网站上的另一个页面
- node.js - 如何使用角色管理访问控制以不允许基本用户能够更新不属于自己的帐户