Передача нескольких значений для одного параметра в службах Reporting Services



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



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

1705   20  

20 ответов:

хотя решение Джона Сэнсома работает, есть еще один способ сделать это, не используя потенциально неэффективный скалярный UDF. В отчете SSRS на вкладке Параметры определения запроса задайте для параметра значение

=join(Parameters!<your param name>.Value,",")

в запросе вы можете ссылаться на значение следующим образом:

where yourColumn in (@<your param name>)

Это то, что я использую при передаче многозадачного параметра другому многозадачному параметру.

=SPLIT(JOIN(Parameters!<your param name>.Value,","),",")

Это одна из плохих поддерживаемых функций в службах SQL Reporting Services.

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

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

ALTER FUNCTION [dbo].[fn_MVParam]
   (@RepParam nvarchar(4000), @Delim char(1)= ',')
RETURNS @Values TABLE (Param nvarchar(4000))AS
  BEGIN
  DECLARE @chrind INT
  DECLARE @Piece nvarchar(100)
  SELECT @chrind = 1 
  WHILE @chrind > 0
    BEGIN
      SELECT @chrind = CHARINDEX(@Delim,@RepParam)
      IF @chrind  > 0
        SELECT @Piece = LEFT(@RepParam,@chrind - 1)
      ELSE
        SELECT @Piece = @RepParam
      INSERT  @Values(Param) VALUES(CAST(@Piece AS VARCHAR))
      SELECT @RepParam = RIGHT(@RepParam,LEN(@RepParam) - @chrind)
      IF LEN(@RepParam) = 0 BREAK
    END
  RETURN
  END

затем вы можете ссылаться на результаты в предложении where основного запроса Итак:

where someColumn IN(SELECT Param FROM dbo.fn_MVParam(@sParameterString,','))

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

Ура,Джон

Джон Сэнсом и Эд Харпер имеют отличные решения. Однако я не смог заставить их работать при работе с полями ID (т. е. целыми числами). Я изменил функцию split ниже, чтобы привести значения в виде целых чисел, чтобы таблица соединялась со столбцами первичного ключа. Я также прокомментировал код и добавил столбец для порядка, в случае, если порядок списка с разделителями был значительным.

CREATE FUNCTION [dbo].[fn_SplitInt]
(
    @List       nvarchar(4000),
    @Delimiter  char(1)= ','
)
RETURNS @Values TABLE
(
    Position int IDENTITY PRIMARY KEY,
    Number int
)

AS

  BEGIN

  -- set up working variables
  DECLARE @Index INT
  DECLARE @ItemValue nvarchar(100)
  SELECT @Index = 1 

  -- iterate until we have no more characters to work with
  WHILE @Index > 0

    BEGIN

      -- find first delimiter
      SELECT @Index = CHARINDEX(@Delimiter,@List)

      -- extract the item value
      IF @Index  > 0     -- if found, take the value left of the delimiter
        SELECT @ItemValue = LEFT(@List,@Index - 1)
      ELSE               -- if none, take the remainder as the last value
        SELECT @ItemValue = @List

      -- insert the value into our new table
      INSERT INTO @Values (Number) VALUES (CAST(@ItemValue AS int))

      -- remove the found item from the working list
      SELECT @List = RIGHT(@List,LEN(@List) - @Index)

      -- if list is empty, we are done
      IF LEN(@List) = 0 BREAK

    END

  RETURN

  END

используйте эту функцию, как было отмечено ранее:

WHERE id IN (SELECT Number FROM dbo.fn_SplitInt(@sParameterString,','))

ORACLE:

фраза "IN" (решение Ed) не будет работать против подключения Oracle (по крайней мере, версия 10). Тем не менее, нашел эту простую работу-вокруг которой делает. Используя вкладку параметра набора данных, превратите многозначный параметр в CSV:

    :name =join(Parameters!name.Value,",")

затем в предложении WHERE вашего оператора SQL используйте функцию instring для проверки соответствия.

    INSTR(:name, TABLE.FILENAME) > 0

я столкнулся с проблемой с другими замечательными fn_MVParam. SSRS 2005 отправил данные с апострофом в виде 2 кавычек.

я добавил одну строку исправить.

select @RepParam = replace(@RepParam,'''''','''')

моя версия fn также использует varchar вместо nvarchar.

CREATE FUNCTION [dbo].[fn_MVParam]
   (
    @RepParam varchar(MAX),
    @Delim char(1)= ','
   )
RETURNS @Values TABLE (Param varchar(MAX)) AS
/*
  Usage:  Use this in your report SP 
     where ID in (SELECT Param FROM fn_MVParam(@PlanIDList,','))
*/

BEGIN

   select @RepParam = replace(@RepParam,'''''','''')
   DECLARE @chrind INT
   DECLARE @Piece varchar(MAX)
   SELECT @chrind = 1
   WHILE @chrind > 0
      BEGIN
         SELECT @chrind = CHARINDEX(@Delim,@RepParam)
         IF @chrind > 0
            SELECT @Piece = LEFT(@RepParam,@chrind - 1)
         ELSE
            SELECT @Piece = @RepParam
         INSERT @VALUES(Param) VALUES(@Piece)
         SELECT @RepParam = RIGHT(@RepParam,DATALENGTH(@RepParam) - @chrind)
         IF DATALENGTH(@RepParam) = 0 BREAK
      END
   RETURN
END

модификация решения великого Джона, решить:

  • Ошибка"2 кавычки"
  • пробел после одной части в параметре

    
    ALTER FUNCTION [dbo].[fn_MVParam]
    (@RepParam nvarchar(4000), @Delim char(1)= ',')
    RETURNS @Values TABLE (Param nvarchar(4000))AS
    BEGIN
    //2 quotes error
    set @RepParam = replace(@RepParam,char(39)+char(39),CHAR(39))
    DECLARE @chrind INT
    DECLARE @Piece nvarchar(100)
    SELECT @chrind = 1 
    WHILE @chrind > 0
    BEGIN
      SELECT @chrind = CHARINDEX(@Delim,@RepParam)
      IF @chrind  > 0
        SELECT @Piece = LEFT(@RepParam,@chrind - 1)
      ELSE
        SELECT @Piece = @RepParam
      INSERT  @Values(Param) VALUES(CAST(@Piece AS VARCHAR(300)))
      //space after one of piece in parameter: LEN(@RepParam + '1')-1
      SELECT @RepParam = RIGHT(@RepParam,LEN(@RepParam + '1')-1 - @chrind)
      IF LEN(@RepParam) = 0 BREAK
    END
    RETURN
    END
    
    

просто комментарий-я столкнулся с миром боли, пытаясь получить предложение IN для работы в соединении с Oracle 10g.я не думаю, что переписанный запрос может быть правильно передан в БД 10g. Мне пришлось полностью отказаться от многозначности. Запрос будет возвращать данные только при выборе одного значения (из многозначного селектора параметров). Я попробовал драйверы MS и Oracle с теми же результатами. Я хотел бы услышать, если кто имел успех с этим.

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

объявить @paramName как NVARCHAR (500),

если правильно(@paramName, 1) =',' НАЧИНАТЬ SET @paramName = LEFT ((@paramName, LEN ((@paramName)-1) Конец

это отлично работает для меня:

WHERE CHARINDEX(CONVERT(nvarchar, CustNum), @CustNum) > 0

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

установить значение параметра через выражение в наборе:

="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] + '%'

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

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

1) Определите параметр отчета (например, @log_status ) и установите флажок "Разрешить несколько значений"
enter image description here

2) Определите набор данных
3) Откройте окно dataset-properties
3a) на вкладке запрос введите свой запрос: например

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

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

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

например; у меня есть столбец RS, называемый COLS, и этот столбец ожидает одно или несколько значений.

&rp:COLS=1&rp:COLS=1&rp:COLS=5 etc..

что вы можете сделать, это добавить этот код в хранимую процедуру:

set @s = char(39) + replace(@s, ',', char(39) + ',' + char(39)) + char(39)

(предполагая, что @s является многозначной строкой (например, "A, B, C"))

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

хотя я могу видеть, как работают некоторые из замечательных сообщений и последующих настроек, у меня есть только доступ для чтения к базе данных, поэтому для меня не работают решения UDF, SP или view-based. Так что решение Эда Харпера выглядело хорошо, за исключением комментария Венкатесварлуавулы, что вы не можете пройти разделенная запятыми строка в качестве параметра в предложение WHERE IN и ожидает, что он будет работать так, как вам нужно. Но решение Джеффа для ORACLE 10g заполняет этот пробел. Я поставил их вместе с сообщением в блоге Рассела Кристофера по адресу http://blogs.msdn.com/b/bimusings/archive/2007/05/07/how-do-you-set-select-all-as-the-default-for-multi-value-parameters-in-reporting-services.aspx и у меня есть свое решение:

создайте свой многозадачный параметр MYPARAMETER, используя любой доступный источник значения (возможно, набор данных). В моем случае multi-select был из кучи текстовых записей, но я уверен, что с некоторыми настройками он будет работать с другими типами. Если вы хотите выбрать все в качестве позиции по умолчанию, установите тот же источник, что и по умолчанию. Это дает вам пользовательский интерфейс, но созданный параметр не является параметром, переданным в мой SQL.

пропуская вперед к SQL, и решение Джеффа к проблеме WHERE IN (@MYPARAMETER), у меня есть проблема все мои собственные, в этом 1 из значения ("заряд") появляется в одном из других значений ('не отвечает'), т. е. функция charindex может найти ложно-положительный. Мне нужно было найти параметр для разделенного значения как до, так и после. Это означает, что мне нужно убедиться, что разделенный запятыми список имеет ведущую и следящую запятую. И это мой фрагмент SQL:

where ...
and CHARINDEX(',' + pitran.LINEPROPERTYID + ',', @MYPARAMETER_LIST) > 0

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

  • имя из MYPARAMETER_LIST
  • тип текста
  • единственное доступное значение ="," + join(Parameters!MYPARAMETER.Value,",") + "," и метку
    на самом деле это не имеет значения (так как он не будет отображаться).
  • значение по умолчанию точно так же
  • просто чтобы быть уверенным, я всегда устанавливаю обновление в расширенных параметрах обоих параметров свойства

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

Я надеюсь, что объединение этих фрагментов ответов поможет кому-то найти то, что они ищут.

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

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

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

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

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

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

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

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

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

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

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

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

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

ниже Решение работает для меня.

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

  2. в появившемся окне выражения используйте функцию Split (Common Functions - > Text). Пример, показанный ниже:

=Сплит(Параметров!Имя_параметра.Значение,",")

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

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

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

Comments

    Ничего не найдено.