我有一个包含许多行的表,每个行都有一个名为“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来尝试查找任何包含特定搜索词的XML数据的表行(本例中为“1”)。
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+'%'
答案 0 :(得分:3)
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
答案 1 :(得分:3)
您可以使用exist。
select *
from MyTableOfData
where RecordFields.exist('/Record/RecordField[contains(., sql:variable("@SearchTerm"))]') = 1