2011-08-19 3 views
2

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

  1. Реализовать запрос в виде конкатенации ОШ, как это:

    WHERE Data.exist('/Document/ParentKTMNode[text() = sql:variable("@Param1368320145") or 
    text() = sql:variable("@Param2043685301") or ... 
    
  2. Реализовать Способ содержит (...), как это:: запрос с использованием струнного Fn

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

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

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

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

ответ

1

Попробуйте вставить все параметры в таблицы и запроса с использованием SQL: колонка пункт:

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

Это интересная идея. В моих тестах запросы выполняются очень быстро. Я не знаю, если я смогу реализовать это, так как ему нужен реальный стол, и мне нужно как-то вставить нужные мне ключи. Я не знаю, если это может поместиться в код, который я уже получил. Но, похоже, это определенно путь. – Mario