Перепишите этот запрос, чтобы сделать его более масштабируемым - PullRequest
0 голосов
/ 09 июля 2010

У меня на сайте есть страница с несколькими выпадающими списками в качестве фильтров.

Так что процедура SQL для этой страницы будет выглядеть примерно так

IF @Filter1 = 0, @Filter2 = 0, @Filter3 = 0
    BEGIN

          SELECT * FROM Table1        

    END

ELSE IF @Filter1 = 1, @Filter2 = 0, @Filter3 = 0
    BEGIN

          SELECT * FROM Table2        

    END

В начале, было только несколько результатов на фильтр, поэтому было не так много перестановок. Однако было добавлено больше фильтров, так что теперь существует более 20 проверок IF ELSE.

Так что, если у каждого фильтра есть 5 опций, мне нужно будет выполнить 5 * 5 * 5 = 125, ЕСЛИ ELSE проверяет, чтобы вернуть данные, зависящие от фильтров.

Обновление Первый фильтр изменяет условие WHERE, второй фильтр добавляет дополнительные таблицы в набор результатов, третий фильтр изменяет условие ORDER BY

Как сделать этот запрос более масштабируемым, чтобы мне не приходилось писать новую связку операторов IF ELSE для проверки каждого условия каждый раз, когда новый фильтр добавляется в список, кроме использования динамического SQL ...

Ответы [ 3 ]

1 голос
/ 09 июля 2010

Вы должны иметь таблицу правил с формулами, может быть побитовую, и создать запрос, который может включать переменные данные из таблицы и добавляет строку для формирования sql и использования динамического sql для их запуска.

0 голосов
/ 09 июля 2010

Вы можете настроить группу представлений, по одному для каждого «фильтра», а затем выбрать из соответствующего представления на основе того, какой «фильтр» был выбран.

0 голосов
/ 09 июля 2010

Насколько мне не нравится динамический SQL, это может быть время для этого. Вы можете создать запрос по очереди, а затем выполнить его в конце.

Если вы незнакомы, синтаксис выглядит примерно так:

DECLARE @SQL VARCHAR(1000)
SELECT @SQL = 'SELECT * FROM ' + 'SOME_TABLE'
EXEC(@SQL)

Убедитесь, что вы имеете дело с атаками SQL-инъекций, правильным интервалом и т. Д.

В этом случае я приложил бы все усилия, чтобы поместить эту логику в код приложения, но это не всегда возможно. Если вы используете LINQ-to-SQL или другую инфраструктуру LINQ, вы должны сделать это безопасно, но для правильной сборки запроса LINQ может потребоваться определенная креативность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...