Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 搜索xml列的所有节点_Sql_Xml_Sql Server 2008_Tsql - Fatal编程技术网

Sql 搜索xml列的所有节点

Sql 搜索xml列的所有节点,sql,xml,sql-server-2008,tsql,Sql,Xml,Sql Server 2008,Tsql,我正在寻找一种方法来搜索SQLXML列中的所有节点 例如,如果我有以下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&

我正在寻找一种方法来搜索SQLXML列中的所有节点

例如,如果我有以下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>

用户标签1
德克萨斯州12107210
用户标签2
奖金350美元/天
用户定义日期9
11/09/2011
如何搜索包含“奖金”一词的所有值


提前谢谢你。

如果你能假设奖金永远不会出现在标签上

SELECT
  ...
FROM
  ...
WHERE COL_NAME LIKE '%bonus%'
对于一张桌子,它可以如下所示:

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%'

实际上,会有奖金标签。我正在尝试从值节点获取所有奖金值,并将其插入奖金节点。别名
T(N)
T.N
在我的安装中无法识别。这似乎可以工作,但仅适用于一条记录。我想查询整个表。有没有比遍历每条记录更简单的方法?@Eric-当然,你可以使用
交叉应用
。我已经更新了我的答案。@BZN\u DBer您可以在这里尝试:
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