2015-04-28 2 views
3

Мне нужно включить XML-запрос как часть предиката WHERE в инструкции 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])')) 

An expression of non-boolean type specified in a context where a condition is expected, near ')'.

Я искал примеры, но не могу найти XML-запросы используются таким образом.

ответ

3

Я думаю, вы должны использовать xmlCol.exist вместо запроса.

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

Это возвращает ошибку: * XQuery [@ tmp.xmlCol.exist()]: в конце выражения XQuery больше нет токенов. Найдено ')'. * – EvilDr

+0

удален последний) теперь это правильно. – Blim

+0

Супер, спасибо. – EvilDr

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 
+0

Прекрасный пример с переменной. Большое спасибо. – EvilDr

Смежные вопросы