У меня есть отчет в 2005 SSRS, это основано на запросе, это подобно этому:
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND col2 LIKE '%XYZ%'
Я должен смочь динамично включать И часть оператора Where в запросе на основе того, проверил ли пользователь флажок. В основном это - динамический SQL-оператор, и это - проблема. Я попробовал несколько подходов напрасно. Действительно ли это возможно? SSRS 2005 поддерживает динамический SQL?Спасибо!
У Charles почти был корректный ответ.
Это должно быть:
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND (@checked = 0 OR col2 LIKE '%XYZ%')
Это - классический "шаблон" в SQL для условных предикатов. Если @checked = 0
, затем это возвратит все строки, соответствующие остатку от предиката (col1 = 'ABC'
). SQL Server даже не обработает вторую половину OR
.
Если @checked = 1
затем это оценит вторую часть OR
и возвратите соответствие строк col1 = 'ABC' AND col2 LIKE '%XYZ%'
Если у Вас есть несколько условных предикатов, они могут быть объединены в цепочку вместе с помощью этого метода (в то время как, ЕСЛИ и СЛУЧАЙ методы быстро стали бы неуправляемыми).
Например:
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND (@checked1 = 0 OR col2 LIKE '%XYZ%')
AND (@checked2 = 0 OR col3 LIKE '%MNO%')
Не используйте динамический SQL, не используйте ЕСЛИ или СЛУЧАЙ.
Как насчет этого. @checked является Вашей разрядной переменной.
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND (@checked <> 0 and col2 LIKE '%XYZ%')
Править: Кроме того, если Вы не используете сохраненный proc, затем используйте тот.
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND col2 LIKE CASE @checked WHEN 1 THEN '%XYZ%' ELSE col2 END
Возможно, это работало бы на Вас:
if @checked = 1
select * from mytable (nolock) where col = 'ABC'
else
select * from mytable (nolock) where col = 'ABC' AND colw Like '%XYZ%'
Я сожалею, что не использую SSRS очень, но если можно получить значение флажка в @checked параметр, это должно работать.
Поочередно Вы могли использовать оператор CASE WHEN.
Это работало бы в 2000 SSRS, но используемый как последнее прибежище.
(плохой) PSEUDOCODE
="SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'"+
iff(condition,true,"AND col2 LIKE '%XYZ%'","")
Выезд, Выполняющий "Динамические" SQL-запросы. от Руководства Автостопщика по SQL Server 2000 Reporting Services
Один способ сделать это путем генерации запроса SSRS как выражения. В конструкторе отчетов ПРЕДЛОЖЕНИЙ, настроенном Ваш запрос как так:
="SELECT * FROM MyTable WITH (NOLOCK) WHERE col1 = 'ABC'" +
Iif(Parameters!Checked.Value = true," AND col2 LIKE '%XYZ%'","")
Можно также проявить другой подход и использовать Исполнительную функцию:
DECLARE @CommonSelectText varchar(2000)
DECLARE @CompleteSelectText varchar(2000)
SELECT @CommonSelectText = 'SELECT * FROM MyTable (nolock) Where Col = ''ABC'' '
IF @checked = 1
SELECT @CompleteSelectText = @CommonSelectText + ' AND ColW LIKE ''%XYZ%'' '
ELSE
SELECT @CompleteSelectText = @CommonSelectText
EXEC (@CompleteSelectText)
GO
Отметьте использование двух апострофов '
отметить заключенный в кавычки текст.
если можно использовать хранимые процедуры, его, вероятно, легче сделать это там. передайте в своих параметрических усилителях. Создайте Строку SQL на основе своих условий и сделайте ДОЛЖНОСТНОЕ ЛИЦО на строке sql, Ваш сохраненный proc возвратит результаты, в которых Вы нуждаетесь.