Поскольку у вас есть таблицы фильтров, я предполагаю, что эти таблицы, вероятно, динамически заполняются из внешнего интерфейса. Это будет означать, что у вас есть эти таблицы как #temp_table
(или даже материализованная таблица, на самом деле не имеет значения) в вашем сценарии перед фильтрацией по таблице основных данных.
Лично я использую приведенный ниже бит кода для динамической фильтрации без использования динамического SQL.
SELECT *
FROM [masterdata] [m]
INNER JOIN
[filter_table_1] [f1]
ON
[m].[filter_column_1] = ISNULL(NULLIF([f1].[filter_column_1], ''), [m].[filter_column_1])
Как видите, код NULL соответствует условию JOIN, если значение столбца является пустой записью в таблице фильтров. Однако суть этого в том, что вам придется активно заполнять значение столбца пустым на тот случай, если у вас нет записей фильтра, для которых вы хотите сократить общий набор основных данных. После того, как вы заполнили таблицу фильтров пробелом, в этих случаях условие СОЕДИНЕНИЯ будет ПУСТО (NULL), а вместо этого объединится с тем же столбцом из таблицы основных данных. Это должно работать во всех случаях, которые вы упомянули в своем вопросе.
Я обнаружил, что этот фрагмент кода быстрее с точки зрения производительности.
Надеюсь, это поможет. Пожалуйста, дайте мне знать в комментариях.