SSRS: динамическое изменение оператора SQL - PullRequest
5 голосов
/ 26 сентября 2008

У меня есть отчет в SSRS 2005, основанный на запросе, похожем на этот:

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

Мне нужно иметь возможность динамически включать часть AND предложения WHERE в запрос на основе того, установил ли пользователь флажок. По сути, это динамический оператор SQL, и в этом проблема. Я попробовал несколько подходов безрезультатно. Это возможно? SSRS 2005 поддерживает динамический SQL? Спасибо!

Ответы [ 8 ]

14 голосов
/ 26 сентября 2008

Чарльз почти получил правильный ответ.

Должно быть:

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%'

Если у вас есть несколько условных предикатов, их можно объединить в цепочку с помощью этого метода (тогда как методы IF и CASE быстро станут неуправляемыми).

Например:

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
    AND (@checked1 = 0 OR col2 LIKE '%XYZ%')
    AND (@checked2 = 0 OR col3 LIKE '%MNO%')

Не используйте динамический SQL, не используйте IF или CASE.

3 голосов
/ 26 сентября 2008

Как насчет этого. @checked - ваша битовая переменная.

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

Редактировать: Кроме того, если вы не используете сохраненный процесс, используйте его.

1 голос
/ 26 сентября 2008

Один из способов сделать это - сгенерировать запрос SSRS в виде выражения. В конструкторе отчетов BIDS настройте запрос следующим образом:

="SELECT * FROM MyTable WITH (NOLOCK) WHERE col1 = 'ABC'" +
 Iif(Parameters!Checked.Value = true," AND col2 LIKE '%XYZ%'","")
1 голос
/ 26 сентября 2008

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

(плохо) PSEUDOCODE

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

Извлечение Выполнение «динамических» SQL-запросов . из Руководства автостопщика по службам отчетов SQL Server 2000

1 голос
/ 26 сентября 2008
SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND col2 LIKE CASE @checked WHEN 1 THEN '%XYZ%' ELSE col2 END
1 голос
/ 26 сентября 2008

Возможно, это подойдет вам:

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.

0 голосов
/ 26 сентября 2008

если вы можете использовать хранимые процедуры, вероятно, это проще сделать там. передать ваши параметры. Создайте строку SQL на основе ваших условий и выполните EXEC для строки sql, ваш сохраненный процесс вернет вам необходимые результаты.

0 голосов
/ 26 сентября 2008

Вы также можете использовать другой подход и использовать функцию Exec:

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  

Обратите внимание на использование двух апострофов ' для обозначения цитируемого текста.

...