Если ваш выбор столбца статический, альтернативой может быть создание StoredProcedure из этого запроса и сохранение имени StoredProcedure в некоторой таблице QueryMaster.Таким образом, вы можете ограничить свой динамический запрос всего лишь Exec SP_EXECUTESQL <SP_NAME> <Params>
и получить преимущество от скомпилированного запроса для основного выбора.
Вы можете избежать преобразований в планах выполнения с помощью sp_executesql вместо Exec .
В случае, если ваш выбор столбцов также не является статичным, вы можете создать представления вместо сохраненных процедур.Вероятно, это было бы лучше, только если ваша основная таблица велика или используется много объединений.
Это предполагает, что у вас есть большое количество возможных критериев фильтра и небольшое количество фактических критериев фильтра.Например, есть 100 столбцов, по которым пользователь может фильтровать, но они, вероятно, будут создавать 25-30 таких комбинаций и продолжат использовать их.
Если у вас ограниченное количество столбцов для фильтрации, лучшим способом было бы создание одного универсального предложения where с использованием Case
, IsNull
, Collace
и т. Д. См. Реализация динамического WHERE-Включить статический SQL для нескольких примеров.