У меня есть отчет SSRS. в главном запросе есть длинный запрос SQL, в последнем SELECT я хочу отфильтровать результаты с помощью выражения WHERE, фильтр должен быть с параметром с несколькими значениями.

Я установил параметр следующим образом:

  • Создайте новый набор данных с запросом.

enter image description here enter image description here

  • Добавьте новый параметр в папку «Параметры» (с именем NewParam).

enter image description here enter image description here

  • Установите флажок «Разрешить несколько значений».

  • Добавьте параметр в «Основной запрос» и установите значение с помощью этого выражения:

=Join(Parameters!NewParam.Value,",") 
  • В конце основного запроса я фильтрую результаты:
select * 
from @FinalStatusTbl 
where Test_Number in (@NewParam) 
order by Priority

enter image description here enter image description here

Проблема в том, что

В отчете, когда я выбираю одно значение из списка, я получил ожидаемые результаты, но если я выбрал несколько значений, результаты будут пустыми (не получено сообщение об ошибке).

Вы знаете почему?

(Когда я пытаюсь это сделать: where Test_Number in ('Test 1', 'Test 2') это работает хорошо).

2
Shayki Abramczyk 20 Авг 2018 в 16:38

4 ответа

Лучший ответ

Когда вы создаете набор данных с запросом sql, многозначные параметры работают с in(@ParamName) без каких-либо изменений.

Замените ваш =Join(Parameters!NewParam.Value,",") просто =Parameters!NewParam.Value, и все будет в порядке.


Тем не менее, причина, по которой вы видите людей, использующих это выражение join, заключается в том, что иногда ваш запрос значительно замедляется, если у вашего параметра много потенциальных вариантов выбора, а ваши данные достаточно большие. Здесь нужно объединить выражение join с функцией разделения строк в наборе данных, которая преобразует результирующее строковое значение Value1,Value2,Value3 в таблицу, которую можно использовать в запросе через inner join.

Это также является обязательным требованием при передаче нескольких значений в качестве параметра хранимой процедуре, поскольку вы не можете использовать синтаксис in(@ParamName).

1
iamdave 20 Авг 2018 в 13:49

Вы можете попробовать удалить параметр из предложения where и использовать этот параметр в разделе фильтров свойств набора данных.

Это эффективно сместит фильтрацию с SQL на SSRS.

0
stamina 20 Авг 2018 в 13:51

Что вам нужно сделать, это разделить вашу строку в базе данных. В запросе передается «Тест 1, Тест 2» как полная строка, а не «Тест 1» и «Тест 2». Вот почему одно значение работает, а несколько значений нет.

Здесь действительно хорошая ссылка о том, как разбивать строки, в подготовке к вашему сценарию. Чаще всего я использую функцию - пример CTE, который возвращает таблицу моих разделенных строк. Затем я изменяю свой SQL-запрос, чтобы использовать IN в возвращаемой таблице.

В вашем примере вы захотите написать WHERE Test_Number IN (SELECT Item FROM dbo.ufn_SplitStrings(@NewParam), где ufn_SplitString - это функция, которую вы создаете по ранее упомянутой ссылке.

0
DimUser 20 Авг 2018 в 14:31

Это то, что я сделал, и это хорошо работает для меня. Вы можете попробовать это тоже.

=sum(if(Fields!Business_Code.Value = "PH" 
and (Fields!Vendor_Code.Value = "5563"
and Fields!Vendor_Code.Value = "5564"
and Fields!Vendor_Code.Value = "5565"
and Fields!Vendor_Code.Value = "5551")
, Fields!TDY_Ordered_Value.Value , nothing ))

enter image description here

0
Bhargav Rao 23 Янв 2020 в 02:50
51931993