我有一个包含许多行的表,每行都有一个名为“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/