Должно быть быстрее использовать собственный XML метод .exist()
.
Сначала создайте сценарий макета для имитации вашей проблемы:
DECLARE @tbl TABLE(ID INT IDENTITY, SomeText VARCHAR(100),Properties XML);
INSERT INTO @tbl VALUES('John Doe exists'
,'<properties>
<property key="ActivityId" />
<property key="UserName">John Doe</property>
</properties>')
,('John Doe doesn''t exist'
,'<properties>
<property key="ActivityId" />
<property key="UserName">Someone else</property>
</properties>')
,('John Doe exists'
,'<properties>
<property key="ActivityId" />
<property key="UserName">John Doe</property>
</properties>');
- Мы можем использовать переменные для общей фильтрации
DECLARE @SearchFor VARCHAR(100)='UserName';
DECLARE @FindThis VARCHAR(100)='John Doe';
- Это запрос:
SELECT *
FROM @tbl t
WHERE t.Properties.exist('/properties/property[@key=sql:variable("@SearchFor") and text()[1]=sql:variable("@FindThis")]')=1;
Идея вкратце:
- Мы можем используйте
.exist()
непосредственно в предложении WHERE. - Значение WHERE TRUE, если в заданном XPath имеется хотя бы одно попадание
=1
можно установить на =0
в порядок возврата отрицательного набора - XPath использует предикат XQuery для поиска
<property>
с заданным ключом и значением.