2011-12-13 96 views
2

我正在寻找一种方法来搜索sql xml列中的所有节点。搜索所有节点的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 12107210</Value> 
    </EntityPropertyOfString> 
    <EntityPropertyOfString> 
    <Name>User Label 2</Name> 
    <Value>BONUS $350/DAY</Value> 
    </EntityPropertyOfString> 
    <EntityPropertyOfString> 
    <Name>User Defined Date 9</Name> 
    <Value>11/09/2011</Value> 
    </EntityPropertyOfString> 
</ArrayOfEntityPropertyOfString> 

我如何搜索包含单词“奖金”全部价值观

预先感谢您。

回答

4
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 12107210</Value> 
</EntityPropertyOfString> 
<EntityPropertyOfString> 
<Name>User Label 2</Name> 
<Value>BONUS $350/DAY</Value> 
</EntityPropertyOfString> 
<EntityPropertyOfString> 
<Name>User Defined Date 9</Name> 
<Value>11/09/2011</Value> 
</EntityPropertyOfString> 
</ArrayOfEntityPropertyOfString>' 

select T.N.value('local-name(.)', 'nvarchar(max)') as NodeName, 
     T.N.value('text()[1]', 'nvarchar(max)') as NodeValue 
from @xml.nodes('//*') as T(N) 
where T.N.value('text()[1]', 'nvarchar(max)') like '%bonus%' 

结果:

NodeName    NodeValue 
-------------------- -------------------- 
Value    BONUS $350/DAY 

对于表它可能看起来像这样:

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 12107210</Value> 
    </EntityPropertyOfString> 
    <EntityPropertyOfString> 
    <Name>User Label 2</Name> 
    <Value>BONUS $350/DAY</Value> 
    </EntityPropertyOfString> 
    <EntityPropertyOfString> 
    <Name>User Defined Date 9</Name> 
    <Value>11/09/2011</Value> 
    </EntityPropertyOfString> 
</ArrayOfEntityPropertyOfString>' 

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

select T1.ID, 
     T2.N.value('local-name(.)', 'nvarchar(max)') as NodeName, 
     T2.N.value('text()[1]', 'nvarchar(max)') as NodeValue 
from @T as T1 
    cross apply T1.XMLCol.nodes('//*') as T2(N) 
where T2.N.value('text()[1]', 'nvarchar(max)') like '%bonus%' 

结果:

ID   NodeName    NodeValue 
----------- -------------------- -------------------- 
1   Value    BONUS $350/DAY 
2   Value    BONUS $350/DAY 
+0

在我的安装中,别名“T(N)”和“T.N”无法识别。 – Glenn

+0

这似乎可以工作,但仅限于一条记录。我想查询整个表格。 – Eric

+0

有没有比循环遍历每条记录更简单的方法? – Eric

0

如果你可以作出这样的奖金将永远不会在标签中出现的假设......

SELECT 
    ... 
FROM 
    ... 
WHERE COL_NAME LIKE '%bonus%' 
+1

实际上,会有奖金TAgs。我试图从价值节点中获取所有奖金值并将它们插入奖金节点。 – Eric