Я создаю инструмент отчетности, в котором пользователь может выбрать оператора и 2 значения для фильтрации.T-SQL: фильтр с динамическим оператором сравнения (=, =, ...)
Моя основная таблица:
UserID UserName
-------------------------------
1 User1
2 User2
3 User3
4 User4
5 User5
Пользователь может выбрать оператор, который я хотел бы перевести так:
Option SQL Operator
------------------------------
between column between x and y
like column '%' + x + '%'
greater than column > x
less than column < x
equal to column = x
not equal to column <> x
Я думал о чем-то подобным:
... column = ISNULL(@parameter, column)
в том смысле, что если вы передадите что-то или ничего, он все равно запросит правильно.
Вот TSQL Играю с (** НЕ РАБОТАЕТ *):
declare @bwValue1 varchar(200) = '2', --between value 1
@bwValue2 varchar(200) = '4'; --between value 2
select * from users where
(UserID BETWEEN @bwValue1 AND @bwValue2
OR UserID != @bwValue1
OR UserID = @bwValue1
OR UserID < @bwValue1
OR UserID > @bwValue1
OR UserID LIKE '%' + @bwValue1 + '%');
есть способ, чтобы написать TSQL, который не может правильно оценить заявление независимо от того, какой оператор выбран ?
* Окончательный ответ *
Вот что я закончил с для тех, кто любопытно:
declare @fn varchar(200) = 'carl',
@Op varchar(3) = 'bw',
@bwValue1 varchar(200) = '978',
@bwValue2 varchar(200) = '2000'
select * from users where userfirstname like '%' + @fn + '%'
AND ((@Op = 'eq' AND (userid = @bwValue1))
OR (@Op = 'neq' AND (userid <> @bwValue1))
OR (@Op = 'lt' AND (userid < @bwValue1))
OR (@Op = 'gt' AND (userid > @bwValue1))
OR (@Op = 'li' AND (userid like '%' + @bwValue1 + '%'))
OR (@Op = 'bw' AND (userid between @bwValue1 and @bwValue2)))
Создайте динамический SQL на основе указанных параметров. –
Да, я пытался избежать этого. Требования говорят, что я должен использовать «Parameterized SQL», чтобы sql мог кэшировать sp для будущего использования, планирования выполнения и т. Д. – Losbear
Я не думаю, что с таким множеством разнообразных параметров SQL может создать нормальный устойчивый план, который будет работать хорошо во всех сценарии. –