SQL Server 2005 - 在XML字段中搜索值

时间:2010-09-13 18:16:18

标签: sql-server xml sql-server-2005

我正在尝试查询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字段的所有匹配记录。

2 个答案:

答案 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