我有一个包含许多行,每行一个名为“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+'%'