1
select *
from tablename
where CONVERT(xml, Sections).value('(/sections/section/@value)[1]', 'varchar(1)') = 'f'

[セクション]列に次の値を持つレコードを適切に取得します。

<sections><section value="f" priority="4" /><section value="a" priority="4" /></sections>

しかし、これを見逃します:

<sections><section value="w" priority="4" /><section value="f" priority="4" /></sections>

明らかにこれは問題です" /sections/section/@value)[1]"しかし、私は構文を理解しておらず、Googleはあまり役に立ちませんでした。ここまで到達したコードをいくつか見つけましたが、最初のタグだけでなくすべてのタグを調べるように変更する方法がわかりません。ドロップしようと[1]しましたが、次のエラーが発生しました。

XQuery [value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'
4

2 に答える 2

2

present()を使用できます。

select *
from tablename
where CONVERT(xml, Sections).exist('/sections/section[@value = "f"]') = 1

fクエリにハードコーディングされた代わりに動的な値を使用する場合は、 sql:variable()を使用できます。

declare @Value varchar(10) = 'f'

select *
from tablename
where CONVERT(xml, Sections).exist('/sections/section[@value = sql:variable("@Value")]') = 1
于 2011-08-24T16:48:27.780 に答える
1

XMLタグのエントリが複数ある場合は、.nodes()XQueryメソッドを使用する必要があります。

select 
    *,
    Sections(Section).value('(@value)[1]', 'varchar(1)') 
from tablename
cross apply CONVERT(xml, Sections).nodes('/sections/section') AS Sections(Section)

これを使用して、XPathに一致する要素ごとに(下Sections(Section)ごとに)1つのXML行を含むという「疑似テーブル」を作成します。次に、この疑似テーブルにアクセスし、通常の方法を使用して、これらのXML「行」から個々の情報を抽出できます。<section><sections>.value()

于 2011-08-24T16:45:09.623 に答える