在sql xml表列中搜索特定的实体名称

时间:2011-12-12 23:36:53

标签: sql xml sql-server-2008 tsql

是否可以在sql列中搜索实体名称?

例如,如果我有一个看起来像

的列
<ArrayOfEntityPropertyOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<EntityPropertyOfString>
<Name>User Label 1</Name>
<Value>TX</Value>
 </EntityPropertyOfString>
 <EntityPropertyOfString>
<Name>PD Rate</Name>
<Value>0</Value>
</EntityPropertyOfString>
<EntityPropertyOfString>
<Name>Bonus Day Rate</Name>
<Value>300</Value>
</EntityPropertyOfString>
</ArrayOfEntityPropertyOfString>

如何选择所有具有“奖励日费率”的记录来获取其值?

提前谢谢

2 个答案:

答案 0 :(得分:1)

这是一种方式:

SELECT @x.query('(//EntityPropertyOfString[./Name="Bonus Day Rate"]/Value)').value('(.)[1]', 'int')

基本上,您会找到名为EntityPropertyOfString的所有节点,并查找具有Name子节点的特定节点,其值为“Bonus Day Rate。该位置由方括号表示;一旦您拥有该节点您将查询Value子节点的第一个位置,并将其转换为int。

答案 1 :(得分:0)

declare @T table (ID int identity primary key, XMLCol xml)

declare @xml xml =
'<ArrayOfEntityPropertyOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<EntityPropertyOfString>
<Name>User Label 1</Name>
<Value>TX</Value>
 </EntityPropertyOfString>
 <EntityPropertyOfString>
<Name>PD Rate</Name>
<Value>0</Value>
</EntityPropertyOfString>
<EntityPropertyOfString>
<Name>Bonus Day Rate</Name>
<Value>300</Value>
</EntityPropertyOfString>
</ArrayOfEntityPropertyOfString>'

insert into @T values (@xml)
insert into @T values (@xml)

select T1.ID,
       T2.N.value('Value[1]', 'int') as Value
from @T as T1
  cross apply T1.XMLCol.nodes('/ArrayOfEntityPropertyOfString/EntityPropertyOfString[Name = "Bonus Day Rate"]') as T2(N)

结果:

ID          Value
----------- -----------
1           300
2           300