1

私はそのようなテーブルを持っています:

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

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

<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 に含まれるすべての行 (キー = 1、値 = 'Web') および (キー = 2、値 = 'Email') を含むすべての行を選択することです。

これまでのところ、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, Email) と (2, Web) などの 2 つのキーと値のペアが含まれる行を返します。

4

1 に答える 1

3

このような何かがそれを行う必要があります。

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
于 2014-01-09T16:00:20.590 に答える