Как получить количество элементов в многозначном параметре SSRS - PullRequest
1 голос
/ 25 апреля 2011

У меня есть форма службы отчетов SQL Server, которая должна запрашивать и отображать метрики в течение ряда лет.

Форма может дополнительно принимать годы, которые она должна отображать в качестве параметра. У меня проблема с указанием «если @year не установлен, то включите все, в противном случае ограничьте указанными годами».

Запрос, который у меня сейчас есть:

SELECT name, collected_year, value, [order]
  FROM rpt_competency_metric
 WHERE ( len( @year ) = 0 OR collected_year IN ( @year ) )
   AND competency_id = @competency_id

Работает, когда @year не заполнено, но завершается ошибкой The len function requires 1 argument. при передаче нескольких значений.

Я пытался count( @year ) и DataLength( @year ) безуспешно.

Ответы [ 4 ]

3 голосов
/ 11 мая 2011

ОК, я знаю, что это устарело, но я думаю, что теперь у меня есть ответ.

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

SELECT name, collected_year, value, [order]
  FROM rpt_competency_metric
 WHERE ( @mvpCount = 0 OR collected_year IN ( @year ) )
   AND competency_id = @competency_id 

На стороне RS вы будете использовать выражение для установки @mvpCount на счетчик вашего @year:

=Parameters!Year.Count

Я не пробовал, но думаю, что это сработает.

1 голос
/ 25 марта 2016

Я не нашел удовлетворительного ответа на этот вопрос в Интернете, поэтому после долгих размышлений и молитв я нашел это решение.

Проблема, с которой сталкиваются я и все остальные, заключается в том, что единственный способ обработки многозначной переменной SSRS заключается в добавлении предложения where:

Table.FieldName in (@MultiValue)

Таким образом, чтобы проверить, есть ли что-то в переменной @MultiValue, вам нужно сделать следующее. В поле запроса или в хранимой процедуре вам необходимо выяснить, были ли сделаны какие-либо выборки, и поместить их в таблицу sql памяти. Затем в другом запросе получите количество строк и поместите их в переменную. Затем используйте эту переменную в запросе, чтобы определить, следует ли искать по этим критериям.

Вот пример в SQL:

DECLARE @GroupCnt int;
Declare @TblGroup Table (GroupID int);

Insert INTO @TblGroup (GroupID)
SELECT ItemID
FROM Groups
WHERE ItemId in (@Group)

SELECT @GroupCnt = COUNT(*)
From @TblGroup

SELECT        CAST(ItemId AS Varchar(10)) AS ProviderID, ProviderShortName AS Location
FROM            Provider as prov
WHERE        (IsActive = 1)
    and (@GroupCnt = 0 or prov.GroupId in (@Group)) 
UNION ALL
SELECT        '' AS ProviderID, '(NONE)' AS Location
ORDER BY Location

В коде "and (@GroupCnt = 0 or prov.GroupId in (@Group))" происходит магия, но для этого необходимо получить переменную @GroupCnt из первых двух запросов.

К вашему сведению, я добавляю UNION ALL, чтобы у пользователя была возможность не выбирать никаких опций.

1 голос
/ 26 января 2012

Спасибо, Queso.

Решение, которое вы предложили ниже, работает как шарм.Я боролся с этим больше половины дня.

SELECT 
    name
  , collected_year
  , value
  , [order] 
FROM rpt_competency_metric 
WHERE ( len('@year') = 0 
    OR collected_year IN ( @year ) )   
    AND competency_id = @competency_id 
0 голосов
/ 26 апреля 2011

Параметры с несколькими значениями преобразуются в список через запятую.Таким образом, вы используете это при использовании функции len:

SELECT name, collected_year, value, [order]
      FROM rpt_competency_metric
     WHERE ( len(2007,2008) = 0 OR collected_year IN ( 2007,2008 ) )
       AND competency_id = @competency_id

, которая также объясняет вашу ошибку.Один из них может работать, но я не проверял их:

SELECT name, collected_year, value, [order]
  FROM rpt_competency_metric
 WHERE ( @year is null OR collected_year IN ( @year ) )
   AND competency_id = @competency_id

Или:

SELECT name, collected_year, value, [order]
  FROM rpt_competency_metric
 WHERE ( rtrim(ltrim(convert(varchar,'@year'))) = '' OR collected_year IN ( @year ) )
   AND competency_id = @competency_id

Попробуйте описать выше с одинарными кавычками и без них около @ года.

Не знаю, что делает SSRS с многозначным параметром в литеральной строке, но если он заменит его напрямую, это может сработать, что близко к тому, что у вас есть:

SELECT name, collected_year, value, [order]
  FROM rpt_competency_metric
 WHERE ( len('@year') = 0 OR collected_year IN ( @year ) )
   AND competency_id = @competency_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...