Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在多个条件下过滤XML字段_Sql_Sql Server_Xml_Sql Server 2012_Cross Apply - Fatal编程技术网

Sql 如何在多个条件下过滤XML字段

Sql 如何在多个条件下过滤XML字段,sql,sql-server,xml,sql-server-2012,cross-apply,Sql,Sql Server,Xml,Sql Server 2012,Cross Apply,我有一张这样的桌子: CREATE TABLE MyTable( Id [int] IDENTITY(1,1) NOT NULL, XmlField xml NULL, /// Some other fields ) XML字段包含C字典的XML表示形式。例如: 如果我添加和x.fields.value'key/int/text[1],'int'=2和x.fields.value'value/string/text[1],'varcharMAX'=Email',那么逻辑

我有一张这样的桌子:

CREATE TABLE MyTable(
    Id [int] IDENTITY(1,1) NOT NULL,
    XmlField xml NULL,
    /// Some other fields
)
XML字段包含C字典的XML表示形式。例如:

如果我添加和x.fields.value'key/int/text[1],'int'=2和x.fields.value'value/string/text[1],'varcharMAX'=Email',那么逻辑上不会返回任何内容

我也尝试过不使用交叉应用,而是使用一个简单的过滤器:

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包含2个键值对的行,例如1,Email和2,Web

类似的东西应该可以做到这一点

挑选* 从MyTable作为T 其中T.XmlField.exist'/dictionary[item[key/int/text=1和value/string/text=Web]和 项[key/int/text=2和value/string/text=Email]]'=1
简直完美。看来我需要一个XPath速成班!谢谢
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')
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