Уменьшите динамический SQL, используя CASE, чтобы использовать «IN» или нет - PullRequest
1 голос
/ 12 июля 2010

Я преобразую хранимую процедуру, которую я ранее написал как строку, затем, используя параметры BIT, я решил, добавлять ли определенные предложения WHERE / ON

Этому sp передается несколько строк, разделенных запятыми, а затем некоторые динамические предложения WHERE выглядят следующим образом:

IF @pUse_Clause_A THEN SET @WhereClause = @WhereClause + ' AND [FIELD_A] IN (' + @pComma_Separated_List_A + ')'

В этом случае @pComma_Separated_List_A - это что-то вроде '1,3,6,66,22' ... список вещей, которые я хочу включить.

Теперь я изменяю их из строк в TVP, чтобы я мог просто использовать «настоящий» SQL И [FIELD_A] IN (ВЫБРАТЬ [TVP_FIELD] ОТ @pTVP_A)

Когда я делаю это, мне не нравится метод построения строк

Однако мне также не нравится вкладывать операторы IF.

IF A 
    ENTIRE SQL WHERE A
ELSE
    ENTIRE SQL WITHOUT WHERE CLAUSE

Чем больше параметров я добавляю, тем сложнее становится:

IF A
    IF B
        SQL WHERE A AND B
    ELSE
        SQL WHERE A
ELSE
    IF B
        SQL WHERE B
    ELSE
        SQL

Я бы предпочел сделать что-то вроде этого:

SELECT * FROM TABLE
WHERE 1=1
CASE USE_A WHEN 1 THEN 
     AND [FIELD_A] IN (SELECT A FROM TBP_A)
END
CASE USE_B WHEN 1 THEN
     AND [FIELD_B] IN (SELECT B FROM TVP_B)
END

Я знаю, что он игнорировал SQL за пределами выбранного результата "IF", но наличие всего этого дублированного оператора кажется небрежным

1 Ответ

2 голосов
/ 12 июля 2010

Динамическое изменение поисков на основе заданных параметров - сложная тема, и выполнение одного способа по другому, даже с очень небольшим отличием, может иметь серьезные последствия для производительности.Ключ в том, чтобы использовать индекс, игнорировать компактный код, игнорировать беспокойство по поводу повторения кода, вы должны составить хороший план выполнения запроса (используйте индекс).

Прочтите это и рассмотрите все методы.Ваш лучший метод будет зависеть от ваших параметров, ваших данных, вашей схемы и вашего фактического использования:

Условия динамического поиска в T-SQL by Erland Sommarskog

Проклятие и благословения динамического SQL Эрланда Соммарского

...