多くの行を含むテーブルがあり、それぞれに検索対象の XML データを含む「RecordData」という名前の列があります。
この列の 3 行分のサンプル 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 と 3 の両方ではなく、行 1 になります。
私は関連する MSDN の記事を少し読みましたが、制限を削除して最終的にこれを解読する方法を見つけることに近づいていないため、Google で失敗した日を過ごしています。
どんな助けでも大歓迎です:)
編集:
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+'%'