我需要在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查询。
答案 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