Это зависит от вашего XML (вы не показали пример, но я предполагаю, что это что-то вроде EAV).
Вы можете попробовать использовать метод XML .exist()
:
DECLARE @mockup TABLE(ID INT IDENTITY,Comment VARCHAR(100),SerializedObject XML);
INSERT INTO @mockup VALUES
('just one of them','<object><param id="111" value="-1"/></object>')
,('both, but wrong values','<object><param id="111" value="-1"/><param id="222" value="-1"/></object>')
,('both, should fit','<object><param id="111" value="-1"/><param id="222" value="8"/></object>')
SELECT o.Id,o.Comment,o.SerializedObject
FROM @mockup o
WHERE o.SerializedObject.exist('/object[param[@id="111" and @value="-1"] and param[@id="222" and @value="8"]]')=1;
.exist()
здесь самый быстрый, потому что он не возвращает никакого значения. Он просто вернет 1
при первом обнаружении вхождения. Это особенно быстро, когда есть много случаев <param id="111" value="???">
В противном случае вам придется измельчить всю партию и поместить фильтр на весь набор результатов.
И - конечно! - необходимая подсказка: как сказано в комментарии Jeroen Mostert, работа с большими XML может оказаться бутылочным горлышком. Если вам это нужно чаще, вы можете подумать о реляционном дизайне вместо больших XML ...