我正在尝试查询XML字段中的特定值。我见过很多例子,但它们似乎并不是我想要的
假设我的xml字段被称为XMLAttributes和表TableName,完整的xml值如下所示:
<Attribute name="First2Digits" value="12" />
<Attribute name="PurchaseXXXUniqueID" value="U4RV123456762MBE79" />
(虽然xml字段经常有其他属性,而不仅仅是PurchaseXXXUniqueID)
如果我在PurchaseXXXUniqueID属性名称中寻找特定值 - 比如说U4RV123456762MBE79 - 我该如何编写查询?我相信它会是这样的:
select *
from TableName
where XMLAttributes.value('(/path/to/tag)[1]', 'varchar(100)') = '5FTZP2QT8Z3E2MAV2D'
...但这是我需要弄清楚的路径/ to / tag。
或者可能还有其他方法可以获得我想要的值。
总结一下 - 我需要获取一个表中的所有记录,其中xml字段中特定属性的值与我将传递给查询的值匹配。
感谢您的帮助! 西尔维亚
编辑:我试图让这更简单,但是如果它有所不同 - 最终我会有一个50左右的临时表,其中包含PurchaseXXXUniqueID字段的潜在值。对于这些,我想从表中获取XML字段的所有匹配记录。
答案 0 :(得分:1)
这应该有效:
SELECT
(fields from base table),
Nodes.Attr.value('(@name)[1]', 'varchar(100)'),
Nodes.Attr.value('(@value)[1]', 'varchar(100)')
FROM
dbo.TableName
CROSS APPLY
XMLAttributes.nodes('/Attribute') AS Nodes(Attr)
WHERE
Nodes.Attr.value('(@name)[1]', 'varchar(100)') = 'PurchaseXXXUniqueID'
AND Nodes.Attr.value('(@value)[1]', 'varchar(100)') = 'U4RV123456762MBE79'
对于XML列中的每个<Attribute>
节点,您基本上需要将基表的行与一个“伪行”连接起来,并从<Attribute>
节点中挑选出各个属性值选择你要找的东西。
答案 1 :(得分:0)
那样的东西?
declare @PurchaseXXXUniqueID varchar(max)
set @PurchaseXXXUniqueID = 'U4RV123456762MBE79';
select * from TableName t
where XMLAttributes.exist('//Attribute/@value = sql:variable("@PurchaseXXXUniqueID")') = 1