![]() |
|
Модераторы: Akina |
![]()
|
|
| mihryak |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: нет Всего: 36 |
Привет!
Пытаюсь написать табличную фукцию для полнотекстового поиска, выбирающую предикат FREETEXT или CONTAINS в зависимости от переданного параметра.
Судя по ошибке про неправильный синтаксис запроса при выполении мой функции (CONTAINS не поддерживает несколько слов; их надо через OR или AND перечислять), оба условия выполняются полностью, что недопустимо. Гугл подсказал, что нельзя полагаться на порядок и полноту вычисления предикатов. Через CASE переписать условие тоже не вышло, так что пока что единственным получившимся у меня вариантом является создание ещё одной такой же функции (в них, кажется, нельзя писать IF), только с CONTAINS вместо FREETEXT. А в хранимке, которая их вызывает, уже проврять параметр и решать, какую вызвать. Это отвратительно и грустно. Нет ли идей, что можно тут сделать, чтобы избежать массированной копипасты? Это только кусок реального запроса, который в жизни куда больше, что ещё больше вызывает нежелание копипастить. В скуле мало что смыслю, так что рад буду любому совету. Это сообщение отредактировал(а) mihryak - 6.4.2012, 15:41 |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 10 Всего: 161 |
Не грустите. Это нормально. Для разных предикатов доступа таки много лучше использовать разные запросы. Повторное использование, это совсем не про SQL. Здесь это скорее зло. Ибо вью на вью на вью на вью = смерть. Если я правильно понял суть проблемы, вы можете: 1) Использовать временную таблицу, в которую будете сохранять результаты отбора по freeText или по contains двумя запросами, в завиимости от параметра, и в своем мегаэпическом запросе, в качестве источника, использовать эту временную таблицу 2) Вместо оператора or использовать union all. Правда не уверен я в том, как это задружит с рекурсивным cte, но, полагаю, правильная расстановка скобок позволит им замириться 3) Вас никто не заставляет использовать один и тот же паттерн для free text и contains. Вы можете использовать разные, которые будете вычислять в зависимости от параметра (читобы синтаксис не ругался) Это сообщение отредактировал(а) Zloxa - 9.4.2012, 09:26 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| mihryak |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: нет Всего: 36 |
Zloxa, спасибо!
Мне и правда надо научиться перестраиваться с императивных языков на скуль |
|||
|
||||
![]()
|
| Правила форума "MS SQL" | |
|
|
Запрещается! Публиковать ссылки и обсуждать взлом чего бы то ни было.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MS SQL Server | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |