sql - 在所有节点中搜索 xml 列

标签 sql xml sql-server-2008 t-sql

我正在寻找一种方法来搜索 sql 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>

如何搜索包含“bonus”一词的所有值?

提前谢谢您。

最佳答案

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

关于sql - 在所有节点中搜索 xml 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8492219/

相关文章:

c# - 用于检索所有子节点的 Linq-to-XML

sql-server-2008 - 如何检查 SQL Server 中存储过程或函数的上次更改日期

sql 将多行总计选择为每个 account_ID 一行

mysql - 根据多表条件从表中删除条目

php - 从同一个表中选择不同的结果

css - 如何使用 XML 和有限的 CSS 子集以表格格式显示定义列表?

SQL Server 2008 筛选索引

SQL插入子查询错误

mysql - 在 MySQL 查询中将值四舍五入为最接近的 2 的幂

c# - XML 或 Markdown 文档?作为一名新程序员从哪里开始