Реализация запроса IN с использованием XQuery в MSSQLServer 2005 - PullRequest
2 голосов
/ 19 августа 2011

Я пытаюсь запросить столбец xml, используя выражение IN. Я не нашел собственного способа выполнения такого запроса в XQuery, поэтому попробовал два обходных пути:

  1. Реализуйте запрос IN как объединение OR следующим образом:

     WHERE Data.exist('/Document/ParentKTMNode[text() = sql:variable("@Param1368320145") or 
     text() = sql:variable("@Param2043685301") or ...
    
  2. Реализуйте запрос IN с помощью метода String fn: contains (...) следующим образом:

    WHERE Data.exist('/Document/Field2[fn:contains(sql:variable("@Param1412022317"), .)]') = 1
    

Где заданным параметром является (длинная) строка со значениями, разделенными "|"

Проблема в том, что Версия 1. не работает более чем с 50 аргументами. Сервер выбрасывает исключение нехватки памяти. Версия 2. работает, но очень, очень медленно.

У кого-нибудь есть идея? Чтобы сформулировать проблему более полно: учитывая список значений любого собственного типа sql, выберите все строки, столбец xml которых имеет одно из указанных значений в определенном поле в xml.

1 Ответ

1 голос
/ 23 сентября 2011

Попробуйте вставить все ваши параметры в таблицу и выполнить запрос, используя sql: column предложение:

SELECT Mytable.Column FROM MyTable
CROSS JOIN (SELECT '@Param1' T UNION ALL SELECT '@Param2') B
WHERE Data.exist('/Document/ParentKTMNode[text() = sql:column("T") 
...