SQL Server2008データベースに次の簡略化された例のような値のXML列があります。
ケース1
<root>
<child>sometimes text here</child>
<otherstuff ..... />
</root>
ケース2
<root>
<child/>
<otherstuff ..... />
</root>
文字列値が与えられた場合、ケース2の選択を含め、「子」ノードで特定の値を持つ行を選択できるようにしたいと思います。
たとえば、ローカル変数がある場合:
declare @queryText nvarchar(MAX)
select @queryText = 'sometimes text here'
次の方法で、ケース1に一致する行を選択できます。
select * from [my_table]
where [my_xml_column].exist('/root/child[text()=sql:variable("@queryText")]') = 1
ただし、@ queryText=''または@queryText=NULLが機能すると予想されるケース2の場合、どちらも一致しません。
回避策として、次を使用できます。
select * from [my_table]
where [my_xml_column].value('(/root/child)[1], 'nvarchar(MAX)') = @queryText
これは機能しますが、何かが足りないように感じ、汚い回避策を使用して、.exist()ではなく.value()で存在をテストします...使用できる[そしてすべきか]同様の式はありますか? .exist()で、特定のテキストまたは空のノードのいずれかに一致しますか?読みやすさを超えて気にする理由はありますか?誰かが私が見逃した露骨に明白なことを指摘するとき、私は私の差し迫ったfacepalmを楽しみにしています。:)