Я преобразую хранимую процедуру, которую я ранее написал как строку, затем, используя параметры 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", но наличие всего этого дублированного оператора кажется небрежным