Уменьшите динамический SQL с помощью СЛУЧАЯ для использования “В” или нет

Я преобразовываю хранимую процедуру, которую я ранее записал как строка затем, с помощью параметров BIT, которые я решил, добавить ли бесспорный ГДЕ/НА пункты

Этот 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, s, таким образом, я могу просто использовать "реальный" SQL как И [FIELD_A] В (ВЫБОР [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 вне выбранного, "ЕСЛИ" результат, но имеющий весь, который копировал оператор, кажется неаккуратным

1
задан Matthew 12 July 2010 в 18:33
поделиться

1 ответ

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

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

Условия динамического поиска в T-SQL, автор: Эрланд Соммарског

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

2
ответ дан 2 September 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: