У нас есть ситуация, когда пользователь может запрашивать любые (или все) поля поиска.Сохраненная процедура SqlServer с необязательными аргументами
Представьте себе следующую таблицу:
CREATE TABLE t_searchable(
Column1 DateTime,
Column2 Varchar(50),
Column3 SmallInt)
Все три колонки проиндексированы, и никто не являются Nullable
.
Теперь пользователь может выполнить поиск по запросу диапазона дат (по Column1
), запрос по Column2
и Column3
или любую их комбинацию.
Я думал о 2 способа сделать это:
первый подход:
Создание 7 различных хранимых процедур:
- Column1
- Column2
- Column3
- Column1 and 2
- Column1 and 3
- Column2 and 3
- Column1 and 2 and 3
И есть клиент выбрать SP для вызова в зависимости от аргументы
2-й подход:
Создайте сингулярный СП с массами и массами IF ELSE
утверждений внутри.
Оба подхода очень громоздки и не являются будущим доказательством, поскольку если мы добавим новый столбец в будущем, который нам нужно будет искать, его будет непросто реализовать, поскольку он будет касаться либо касания клиента И сервер (в случае решения 1) или сделать IF ELSE
еще сложнее, чем для решения 2.
Мой вопрос: есть ли лучший способ сделать это? Я бы хотел в идеале избегать написания пользовательской инструкции SQL в коде, поскольку это может быть против политики компании (они предпочитают SP для пользовательских SQL-исполнений), но чем больше я думаю об этом, тем больше кажется неизбежным, но я думал, что буду спросите экспертов здесь (я не очень хороший @ SQL).
Большое спасибо,
Вы можете использовать Dynamic-SQL, как [здесь] (http://stackoverflow.com/a/32161674/5070879) (опустить часть со временной таблицей) – lad2025