Передача нескольких значений для одного параметра в службах Reporting Services - PullRequest
67 голосов
/ 04 февраля 2009

В моем отчете несколько параметров Multi-Select. Я пытаюсь найти способ передать несколько значений для одного параметра в строке веб-запроса? Если я передаю одно значение, оно работает нормально.

Отчет работает нормально, выбирая несколько вариантов для одного параметра. Моя проблема заключается в строке веб-запроса.

Ответы [ 21 ]

1 голос
/ 12 июня 2018

У меня сработало приведенное ниже решение.

  1. На вкладке параметров свойств вашего набора данных щелкните значок выражения (! http://chittagongit.com//images/fx-icon/fx-icon-16.jpg [символ fx]) рядом с параметром, для которого необходимо разрешить ввод через запятую.

  2. В появившемся окне выражения используйте функцию Split (Общие функции -> Текст). Пример показан ниже:

= Split (Параметры! ParameterName.Value "")

1 голос
/ 05 августа 2016

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

Установите значение параметра через выражение в наборе данных:

="SELECT DISTINCT * FROM (VALUES('" & JOIN(Parameters!SearchValue.Value, "'),('") & "')) 
AS tbl(Value)"

Сам запрос:

DECLARE @Table AS TABLE (Value nvarchar(max))

INSERT INTO @Table EXEC sp_executeSQL @SearchValue 

Пример с подстановочными знаками:

SELECT * FROM YOUR_TABLE yt 

INNER JOIN @Table rt ON yt.[Join_Value] LIKE '%' + rt.[Value] + '%'

Я бы хотел найти способ сделать это без динамического SQL, но я не думаю, что он будет работать из-за способа, которым SSRS передает параметры в реальный запрос. Если кто-то знает лучше, пожалуйста, дайте мне знать.

1 голос
/ 24 мая 2018

это работало для отдельного набора строк (например, «START», «END», «ERROR», «SUCCESS»)

1) определите параметр отчета (например, @log_status) и отметьте «Разрешить множественные значения»
enter image description here

2) определить набор данных
3) открыть окно свойств набора данных
3a) в Query-Tab введите ваш запрос: например,

select * from your_table where (CHARINDEX(your_column, @log_status,0) > 0)

3b) на вкладке «Параметры» введите свой параметр, например,
Parametername: @log_status ; Parametervalue: <<Expr>>
3c) для Expr нажмите кнопку «fx» и введите:

=join(Parameters!log_status.Value,",")

enter image description here

закончен! (это похоже на решение Эда Харпера, но мне жаль, что это не сработало для меня)

1 голос
/ 09 декабря 2016

Таким образом, умноженные текстовые значения будут заканчиваться запросом с одинарными кавычками вокруг каждого, который я использовал = join (Параметры! Customer.Value, "','"). Таким образом, после «.Value» это запятая, двойная кавычка, одинарная кавычка, запятая, одинарная кавычка, двойная кавычка, закрывающая скобка. простейшие:)

1 голос
/ 27 июня 2013
  1. Создание набора данных для списка в отчете
  2. Щелкните правой кнопкой мыши параметр и выберите доступные значения
  3. Выбрать вновь созданный набор данных в качестве набора данных
  4. Добавить значение, переданное хранимой процедуре, в качестве поля значения
  5. Добавить описание параметра в поле метки (если параметром является customerID, метка может быть CustomerName ex.)
  6. Наконец, добавьте следующий код в вашу хранимую процедуру

объявляет @paramName AS NVARCHAR (500),

ЕСЛИ ПРАВО (@paramName, 1) = ',' НАЧАТЬ SET @paramName = LEFT ((@ paramName, LEN ((@ paramName) -1) END

1 голос
/ 04 мая 2013

Речь идет об использовании функции соединения для сохранения многозначного параметра и последующего восстановления точно таких же выборов из базы данных позже.

Я только что закончил отчет, в котором были требования, что параметры должны быть сохранены, и когда отчет открывается снова (отчет передается параметром OrderID), значения, ранее выбранные пользователем, должны быть снова выбраны.

В отчете использовалось полдюжины параметров, каждый из которых имел свой собственный набор данных и результирующий выпадающий список. Параметры были зависимы от предыдущих параметров, чтобы сузить область окончательного выбора, и когда отчет был «просмотрен», для заполнения была вызвана хранимая процедура.

Хранимая процедура получила каждый из параметров, переданных ей из отчета. Он проверил таблицу хранения в базе данных, чтобы увидеть, были ли какие-либо параметры сохранены для этого OrderID. Если нет, то сохраняются все параметры. Если так, он обновил все параметры для этого заказа (это тот случай, когда пользователь передумает позже).

Когда отчет запускается, существует набор данных dsParameters, представляющий собой текст SQL, который выходит и выбирает одну строку для этого идентификатора заказа, если он есть. Каждый из параметров в отчете получает значение по умолчанию из этого набора данных, а свой список выбора - из набора данных, выделенного для этого параметра.

У меня возникли проблемы с параметром множественного выбора. Я использовал команду join (@Value, ",") в списке параметров основного набора данных, передавая хранимой процедуре строку с разделителями-запятыми. Но как его восстановить? Невозможно передать строку с разделителями-запятыми обратно в поле значений по умолчанию для параметра.

Мне пришлось создать еще один набор данных, чтобы разделить параметр, аналогично тому, о чем вы говорите. Это выглядит так:

IF OBJECT_ID('tempdb..#Parse','U') IS NOT NULL DROP TABLE #Parse

DECLARE @Start int, @End int, @Desc varchar(255)

SELECT @Desc = fldDesc FROM dbCustomData.dbo.tblDirectReferralFormParameters WHERE fldFrom = @From and fldOrderID = @OrderID

CREATE TABLE #Parse (fldDesc varchar(255))

SELECT @Start = 1, @End = 1

WHILE @End > 0
    BEGIN
        SET @End = CHARINDEX(',',@Desc,@Start)
        IF @End = 0 
            BEGIN
                INSERT #Parse SELECT REPLACE(SUBSTRING(@Desc,@Start,LEN(@Desc)),',','') AS fldDesc 
                BREAK
            END
        ELSE        
            BEGIN
                INSERT #Parse SELECT REPLACE(SUBSTRING(@Desc,@Start,@End-@Start),',','') AS fldDesc 
            END
        SET @Start = @End + 1
    END

SELECT * FROM #Parse

Каждый раз, когда открывается форма, этот набор данных проверяет в базе данных сохраненную строку для этого многозначного параметра. Если его нет, он возвращает ноль. Если он включен, он разбирает запятые и создает строку для каждого из значений.

Тогда для поля значений по умолчанию устанавливается этот набор данных и fldDesc. Оно работает! Когда я выбираю один или несколько, они сохраняются и пополняются при повторном открытии формы.

Надеюсь, это поможет. Я искал некоторое время и не нашел никаких упоминаний о сохранении строки соединения в базе данных и последующем ее разборе в наборе данных.

0 голосов
/ 23 апреля 2019

Начиная с MSSQL 2016 - с уровнем совместимости 130 вы можете использовать String_Split() для анализа вашего объединенного параметра из SSRS. Допустим, вы хотите заполнить параметр из запроса в SSRS, а затем передать этот параметр в хранимый процесс или в общий набор данных SSRS:

  1. Добавьте два набора данных в свой отчет SSRS, один из которых возвращает список значений и меток для отображения в вашем параметре, а другой содержит фактические данные, которые вы хотите отфильтровать. Каждый из этих наборов данных может быть сохраненным процессом или общим набором данных или встроенным запросом.
  2. Создайте параметр в SSRS, который НЕ находится в наборе данных, который вы хотите отфильтровать. Давайте назовем это Customer
  3. Установите Customer параметр, чтобы разрешить несколько значений, и настройте вкладку Available Values с набором данных, метками и значениями, которые вы хотите отобразить из запроса.
  4. Щелкните правой кнопкой мыши набор данных, который вы хотите отфильтровать, и добавьте параметр, определенный в хранимой процедуре. Давайте назовем это CustomerList.
  5. Нажмите кнопку выражения рядом с полем значения для этого параметра и выполните Join(Parameters!Customer.Value, ",")
  6. В вашем сохраненном протоколе или общем наборе данных используйте string_split, чтобы разбить запятую с разделителем @CustomerList param на массив: Customer.CustID in (select value from string_split(@CustomerList, ',') where value = Customer.CustID)
0 голосов
/ 10 января 2017

Мне нужно решение для Oracle, и я обнаружил, что это работает для меня в моем запросе для моего отчета для БД> = 10g.

выберите * откуда в ( выберите regexp_substr (, '[^,] +', 1, level) из двойного подключиться с помощью regexp_substr (, '[^,] +', 1, level) не равно нулю);

источник https://blogs.oracle.com/aramamoo/entry/how_to_split_comma_separated_string_and_pass_to_in_clause_of_select_statement

0 голосов
/ 29 мая 2014

Это прекрасно работает для меня:

WHERE CHARINDEX(CONVERT(nvarchar, CustNum), @CustNum) > 0
0 голосов
/ 20 марта 2013

В прошлом я прибегал к использованию хранимых процедур и функции для выбора нескольких лет в запросе SQL Server для служб отчетов. Использование выражения Join в значении параметра запроса, предложенного Эд Харпером, по-прежнему не будет работать с предложением SQL IN в операторе where. Я решил использовать следующее в предложении where вместе с параметром Join выражением: и charindex (приведение (Schl.Invt_Yr как char (4)), @Invt_Yr)> 0

...