sql - XQuery:查找包含指定 xml 数据的行

标签 sql tsql xquery xquery-sql

我有一个包含许多行的表,每行都有一个名为“RecordData”的列,其中包含我希望搜索的 XML 数据。

下面给出了来自该列的三行示例 xml 数据:

1:

<Record>
  <RecordField ID="31" Name="Barcode1" DataTypeId="5" TypeName="String" Decimals="0" Format="" Mandatory="False">ABC123</RecordField>
</Record>

2:

<Record>
  <RecordField ID="15" Name="Field 1" DataTypeId="7" TypeName="Boolean" Decimals="0" Format="" Mandatory="False">true</RecordField>
  <RecordField ID="16" Name="Field 2" DataTypeId="5" TypeName="String" Decimals="0" Format="" Mandatory="False">purpke</RecordField>
</Record>

3:

<Record>
  <RecordField ID="15" Name="Field 1" DataTypeId="7" TypeName="Boolean" Decimals="0" Format="" Mandatory="False">true</RecordField>
  <RecordField ID="16" Name="Field 2" DataTypeId="5" TypeName="String" Decimals="0" Format="" Mandatory="False">12</RecordField>
</Record>

我正在使用以下 SQL 尝试查找任何表行,这些行具有包含特定搜索词(本例中为“1”)的 XML 数据。

DECLARE @SearchTerm varchar(max)
    SET @SearchTerm = '1'
    SELECT * 
    FROM MyTableOfData
    WHERE RecordFields.value('contains( (/Record/RecordField/text())[1],sql:variable("@SearchTerm"))','bit') = 1

正如您将看到的,这依赖于出现在第一个“RecordField”元素文本中的搜索词,而不是搜索所有“RecordField”节点。 意思是,我得到的唯一结果是第 1 行,而不是第 1 行和第 3 行。

我已经阅读了一些相关的 MSDN 文章,但今天谷歌失败了,因为我离找到如何消除限制并最终破解这个问题还差得很远。

任何帮助将不胜感激:)

编辑:

DECLARE @SearchTerm varchar(max)
SET @SearchTerm = '1'
select *
from MyTableOfData
    cross apply MyTableOfData.RecordFields.nodes('/Record/RecordField') as tx(r)
where  tx.r.value('.','varchar(10)') like '%'+@searchterm+'%'

抛出:

Msg 493, Level 16, State 1, Line 3
The column 'r' that was returned from the nodes() method cannot be used directly. It can only be used with one of the four XML data type methods, exist(), nodes(), query(), and value(), or in IS NULL and IS NOT NULL checks.

编辑 2:

当你准确地复制你被告知的内容时,而不是遗漏任何东西,这是有效的!:

DECLARE @SearchTerm varchar(max)
SET @SearchTerm = '1'
select MyTableOfData.*
from MyTableOfData
    cross apply MyTableOfData.RecordFields.nodes('/Record/RecordField') as tx(r)
where  tx.r.value('.','varchar(10)') like '%'+@searchterm+'%'

最佳答案

CROSS APPLY 是您找不到的...

select yourtable.*
from yourtable
    cross apply yourtable.RecordFields.nodes('/Record/RecordField') as tx(r)
where  tx.r.value('.','varchar(10)') like '%'+@searchterm+'%'

where tx.r.value('contains((.),sql:variable("@searchterm"))','bit')=1

关于sql - XQuery:查找包含指定 xml 数据的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11738010/

相关文章:

sql-server-2008 - 为多个数据库创建登录

xquery - 如何检查 XQuery 函数中的空日期参数?

xml - 使用 XPath,如何根据文本内容和属性值选择节点?

MySQL 复杂 SQL 查询显示表列不匹配的空值

sql - 在Oracle中将行动态转换为列

c# - LINQ 中的 GroupBy 和 OrderBy

sql - 如何从三个连接表中获取数据,并始终显示第一个表中的数据,以及第三个表中的空值或现有记录?

sql - 在表中查找尾随空格

sql - 外部应用的替代方案是什么?

xml - XQuery 按升序和降序排序