Я преобразовываю хранимую процедуру, которую я ранее записал как строка затем, с помощью параметров 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 вне выбранного, "ЕСЛИ" результат, но имеющий весь, который копировал оператор, кажется неаккуратным
Динамическое изменение результатов поиска, основанное на заданных параметрах, является сложной задачей, и выполнение этого одного способа над другим, даже с очень незначительной разницей, может иметь серьезные последствия для производительности. Ключ состоит в том, чтобы использовать индекс, игнорировать компактный код, игнорировать беспокойство о повторяющемся коде, вы должны составить хороший план выполнения запроса (использовать индекс).
Прочтите это и рассмотрите все методы. Ваш лучший метод будет зависеть от ваших параметров, ваших данных, вашей схемы и вашего фактического использования:
Условия динамического поиска в T-SQL, автор: Эрланд Соммарског
Проклятие и благословения динамического SQL, автор: Эрланд Соммарског