2009-11-13 12 views
10

私は1つのXML列を持つテーブルを持っています。 XMLの特定の属性が文字列と一致する行をフィルタリングしたいと思います。基本的にWHEREまたはHAVINGを実行します。XPath/XQueryを使用してXML列のSQLクエリをフィルタリングします

の表は、この

| id | xml | 

のようなものと私は@name属性の値に一致したすべてのIDを取得したい

<xml> 
    <info name="Foo"> 
    <data .../> 
    </info> 
<xml> 

に似たXMLのものになります。

私は、次の操作を行うことができた:

SELECT id, xml.query('data(/xml/info/@name)') as Value 
FROM Table1 
WHERE CAST(xml.query('data(/xml/info/@name)') as varchar(1024)) = @match 

しかし、それは信じられないほど遅いです。

クエリの出力でより良いフィルタリング方法が必要です。

+0

だろう

、私はまた、あなたのXML列のインデックスを持っていることを確認することをお勧めしたいです。 > [XMLインデックスの概要(SQLServerPedia.com)](http://sqlserverpedia.com/wiki/XML_Indexes_Overview) – Kev

答えて

20

見つけました。 query()を使用する代わりに、exist()を使用する必要があります。あなたはまだ行っていない場合は私のクエリは、その後

SELECT id, xml.query('data(/xml/info/@name)') as Value 
FROM Table1 
WHERE xml.exist('/xml/info/[@name=sql:variable("@match")]') = 1 
関連する問題