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

Весь ваш код может быть таким простым:

let number = Int.random(in: 0 ..< 37)
let color = Int.random(in: 1 ..< 3)

print("The Number is \(number) and the color is \(color == 1 ? "Red" : "Black")")

Вот и все. Нет необходимости в кортеже или в switch.

67
задан Ned Batchelder 14 July 2010 в 23:54
поделиться

6 ответов

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

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

В Вашем запросе, можно затем сослаться на значение как так:

where yourColumn in (@<your param name>)
97
ответ дан Ed Harper 24 November 2019 в 14:27
поделиться

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

1
ответ дан ScottLenart 24 November 2019 в 14:27
поделиться

Это - одна из плохих поддерживавших функций в 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 someColumn IN(SELECT Param FROM dbo.fn_MVParam(@sParameterString,','))

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

С наилучшими пожеланиями, John

20
ответ дан John Sansom 24 November 2019 в 14:27
поделиться

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

=SPLIT(JOIN(Parameters!<your param name>.Value,","),",")
44
ответ дан Mhd. Yasseen 24 November 2019 в 14:27
поделиться

ORACLE:

Фраза «IN» (решение Эда) не будет работать против соединения Oracle ( хотя бы версия 10). Однако нашел этот простой способ обхода. Используя вкладку параметров набора данных, превратите многозначный параметр в CSV:

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

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

    INSTR(:name, TABLE.FILENAME) > 0
5
ответ дан 24 November 2019 в 14:27
поделиться

У Джона Сансома и Эда Харпера отличные решения. Однако я не смог заставить их работать при работе с полями идентификаторов (т.е. целыми числами). Я изменил приведенную ниже функцию разделения, чтобы ПРИВЕСТИ значения в виде целых чисел, чтобы таблица соединялась со столбцами первичного ключа. Я также прокомментировал код и добавил столбец для порядка, на случай, если порядок разграниченных списков был значительным.

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,','))
9
ответ дан 24 November 2019 в 14:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: