使用XML查询作为WHERE谓词的一部分

时间:2015-04-28 13:20:28

标签: sql-server xpath sql-server-2012

我需要在SELECT语句中包含XML查询作为WHERE谓词的一部分。

我有这个结构:

DECLARE @tmp TABLE (typeId int, xmlCol xml);

INSERT INTO @tmp 
    (typeId, xmlCol) 
VALUES 
    (1, '<search><groups><g id="25" /><g id="26" /></groups></search>'),
    (1, '<search><groups><g id="250" /><g id="9" /></groups></search>'),
    (2, '<search><groups><g id="25" /><g id="12" /><g id="125" /></groups></search>');

SELECT * FROM @tmp;

但我需要提取typeId=1和XML数据包含<g id="25" />的行。所以在我的例子中,我只看到结果集中的第一行。

如果可能的话,我更喜欢XML查询,而不是转换为nvarchar并使用LIKE。我试过这个,但只是出现语法错误:

SELECT
    *
FROM
    @tmp
WHERE
    (typeId = 1) AND
    (xmlCol.query('/search/groups/g[@id=25])'))
  

在上下文中指定的非布尔类型的表达式   条件是预期的,接近')'。

我一直在搜索示例,但找不到以这种方式使用的XML查询。

2 个答案:

答案 0 :(得分:3)

我认为您必须使用xmlCol.exist而不是查询。

SELECT
    *
FROM
    @tmp
WHERE
    (typeId = 1) AND
    (xmlCol.exist('/search/groups/g[@id=25]') = 1)

答案 1 :(得分:2)

使用xmlcol.exist。这样的事情。

DECLARE @tmp TABLE (typeId int, xmlCol xml);

INSERT INTO @tmp 
    (typeId, xmlCol) 
VALUES 
    (1, '<search><groups><g id="25" /><g id="26" /></groups></search>'),
    (1, '<search><groups><g id="250" /><g id="9" /></groups></search>'),
    (2, '<search><groups><g id="25" /><g id="12" /><g id="125" /></groups></search>');

 DECLARE @id int = 25

SELECT * FROM @tmp
WHERE typeId = 1 
    AND xmlCol.exist('search/groups/g[@id= sql:variable("@id")]') = 1