Сохранение критериев фильтрации записей в SQL-запросах - PullRequest
2 голосов
/ 04 августа 2011

Я хочу иметь возможность хранить критерии фильтрации записей (в основном то, что следует после WHERE в запросе SELECT) в базе данных, и я хочу позже использовать этот критерий в SELECT. Сценарий состоит в том, что критерий фильтра задается пользователем (редко), и этот критерий используется каждый раз, когда извлекаются записи данных (часто).

Критерий фильтра - это логическое выражение, например: (x AND y) OR z. x, y и z - ключевые слова, которые могут быть связаны с записями данных с помощью таблицы соединений.

Я могу сохранить выражение как text / xml, а затем проанализировать его и динамически создавать SQL-запрос каждый раз, когда я хочу получить данные, но это кажется неэффективным.

Есть ли лучший способ?

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

Если ваш выбор столбца статический, альтернативой может быть создание StoredProcedure из этого запроса и сохранение имени StoredProcedure в некоторой таблице QueryMaster.Таким образом, вы можете ограничить свой динамический запрос всего лишь Exec SP_EXECUTESQL <SP_NAME> <Params> и получить преимущество от скомпилированного запроса для основного выбора.

Вы можете избежать преобразований в планах выполнения с помощью sp_executesql вместо Exec .

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

Это предполагает, что у вас есть большое количество возможных критериев фильтра и небольшое количество фактических критериев фильтра.Например, есть 100 столбцов, по которым пользователь может фильтровать, но они, вероятно, будут создавать 25-30 таких комбинаций и продолжат использовать их.

Если у вас ограниченное количество столбцов для фильтрации, лучшим способом было бы создание одного универсального предложения where с использованием Case, IsNull, Collace и т. Д. См. Реализация динамического WHERE-Включить статический SQL для нескольких примеров.

0 голосов
/ 04 августа 2011

У меня такое чувство, что нет лучшего решения этой проблемы. Вам нужно будет хранить критерии фильтра (предложение where) где-нибудь в базе данных или в файле. Всякий раз, когда вы хотите выполнить запрос, вам нужно будет получить подробную информацию о критериях фильтрации из файла / db и построить запрос, используя некоторый код.

Я не думаю, что есть какой-то способ обойти это - системы БД не имеют функции, которая может помочь с этим.

Если это вызывает проблемы с эффективностью, вы можете кэшировать детали фильтра где-то после их первого чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...