質問

私はそのような表を持っています:

CREATE TABLE MyTable(
    Id [int] IDENTITY(1,1) NOT NULL,
    XmlField xml NULL,
    /// Some other fields
)
.

XMLフィールドには、C#Dictionary<int, string>のXML表現が含まれています。e.g:

<dictionary>
    <item>
        <key><int>1</int></key>
        <value><string>Web</string></value>
    </item>
    <item>
        <key><int>2</int></key>
        <value><string>Email</string></value>
    </item>
    // more item
</dictionary>
.

私がやりたいのは、XMLFieldが含まれているすべての行を選択する(key= 1とvalue= 'web')、も含まれています(key= 2のhice= 2の電子メール ')。

これまで私は1つのユニークなキー/値の一致のために行をフィルタリングすることだけを管理しました:

SELECT TableId, XmlField FROM MyTable
CROSS APPLY XmlField.nodes('/dictionary/item') x(fields)
WHERE (x.fields.value('(key/int/text())[1]', 'int') = 1 
AND x.fields.value('(value/string/text())[1]', 'varchar(MAX)') = 'Web')
.

AND (x.fields.value('(key/int/text())[1]', 'int') = 2 AND x.fields.value('(value/string/text())[1]', 'varchar(MAX)') = 'Email')を追加すると、何も返されません(論理的には)

CROSS APPLYを使用しないことも試み、そのようなシンプルなフィルタを行いました。

SELECT TableId, XmlField FROM MyTable
WHERE XmlField.exist('/dictionary/item/key/int[text() = 1]') = 1
AND XmlField.exist('/dictionary/item/value/string[text() = "Web"]') = 1
.

しかし、それはORのように機能し、XMLが(1、電子メール)、(2、Web)

などの2つのキーと値のペアを含む行を返します。

役に立ちましたか?

解決

これはそれをするべきです。

select *
from MyTable as T
where T.XmlField.exist('/dictionary[item[key/int/text() = 1 and value/string/text() = "Web"] and   
                                    item[key/int/text() = 2 and value/string/text() = "Email"]]') = 1
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top