SSRS: измените SQL-оператор динамично

У меня есть отчет в 2005 SSRS, это основано на запросе, это подобно этому:

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND col2 LIKE '%XYZ%'

Я должен смочь динамично включать И часть оператора Where в запросе на основе того, проверил ли пользователь флажок. В основном это - динамический SQL-оператор, и это - проблема. Я попробовал несколько подходов напрасно. Действительно ли это возможно? SSRS 2005 поддерживает динамический SQL?Спасибо!

5
задан BIReportGuy 18 March 2016 в 06:25
поделиться

8 ответов

У 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, не используйте ЕСЛИ или СЛУЧАЙ.

14
ответ дан 18 December 2019 в 07:32
поделиться

Как насчет этого. @checked является Вашей разрядной переменной.

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND (@checked <> 0 and col2 LIKE '%XYZ%')

Править: Кроме того, если Вы не используете сохраненный proc, затем используйте тот.

3
ответ дан 18 December 2019 в 07:32
поделиться
SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND col2 LIKE CASE @checked WHEN 1 THEN '%XYZ%' ELSE col2 END
1
ответ дан 18 December 2019 в 07:32
поделиться

Возможно, это работало бы на Вас:

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.

1
ответ дан 18 December 2019 в 07:32
поделиться

Это работало бы в 2000 SSRS, но используемый как последнее прибежище.

(плохой) PSEUDOCODE

="SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'"+
iff(condition,true,"AND col2 LIKE '%XYZ%'","")

Выезд, Выполняющий "Динамические" SQL-запросы. от Руководства Автостопщика по SQL Server 2000 Reporting Services

1
ответ дан 18 December 2019 в 07:32
поделиться

Один способ сделать это путем генерации запроса SSRS как выражения. В конструкторе отчетов ПРЕДЛОЖЕНИЙ, настроенном Ваш запрос как так:

="SELECT * FROM MyTable WITH (NOLOCK) WHERE col1 = 'ABC'" +
 Iif(Parameters!Checked.Value = true," AND col2 LIKE '%XYZ%'","")
1
ответ дан 18 December 2019 в 07:32
поделиться

Можно также проявить другой подход и использовать Исполнительную функцию:

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  

Отметьте использование двух апострофов ' отметить заключенный в кавычки текст.

0
ответ дан 18 December 2019 в 07:32
поделиться

если можно использовать хранимые процедуры, его, вероятно, легче сделать это там. передайте в своих параметрических усилителях. Создайте Строку SQL на основе своих условий и сделайте ДОЛЖНОСТНОЕ ЛИЦО на строке sql, Ваш сохраненный proc возвратит результаты, в которых Вы нуждаетесь.

0
ответ дан 18 December 2019 в 07:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: