Как передать многозначные символы в отчете SSRS?


8

У меня есть отчет SSRS, который имеет 3 набора данных, поступающих от одного источника данных. Основной набор данных представляет собой хранимую процедуру, которая объединяет некоторые данные на основе набора параметров, работающих на основе двух других наборов данных.

Основная хранимая процедура, включающая этот отчет, имеет 4 параметра. Один - идентификатор типа данных, два - даты начала и окончания, а третий - просто параметр флага. Параметр flag - это многозначный параметр, в котором я хочу передать несколько значений флага, которые также являются значениями VARCHAR.

В моей хранимой процедуре для моего параметра @Flag у меня есть общее:

WHERE [Flag] IN (@Flag)

Затем, конечно, параметр @Flag в отчете SSRS позволяет разрешить «множественные значения», которые также заполняются из запроса, извлекающего эти значения @Flag из таблицы измерений.

Моя проблема

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

При тестировании многозначного флага непосредственно в хранимой процедуре:

WHERE [Flag] IN ('A', 'B', 'C')

Хранимая процедура работает правильно. Таким образом, проблема не в хранимой процедуре, а в том, как SSRS передает многозначные значения параметру @Flag.

Решения пробовали

Я попытался внести следующие корректировки в набор данных SSRS для этих параметров @Flag:

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

И этот тоже:

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

Все они работают на единичных значениях, но никогда не на нескольких значениях.

Что мне здесь не хватает?

Ответы:


7

Я нашел решение. Я неправильно разделил значения в хранимой процедуре с помощью UDF.

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

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

Это в основном собирается объединить несколько значений в массив и передать его через @Flagпараметр. Следующим шагом является добавление SQL в хранимую процедуру, чтобы правильно получать и переваривать значения, чтобы они считывали значения с помощью INпредложения.

Поиск в Google любой анализатор строк UDF онлайн. Есть из чего выбирать. Я использовал dba_parseString_udfот Мишель Аффорд http://sqlfool.com .

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

WHERE [Flag] IN (SELECT * FROM dba_parseString_udf(@Flag, ','))

Поэтому SSRS передаст следующее значение:

@Flag = 'A,B,C'

Тогда мой UDF правильно проанализирует эту строку:

A
B
C

И заполните мой @Flagпараметр правильноSELECT * FROM UDF()...


В случае, если это поможет кому-то еще: выражение объединения ( =join(Parameters!<your param name>.Value,",")) может быть добавлено в набор данных, читающий параметр, на вкладке «Параметры»: справа от перетаскивания «Значение параметра» есть кнопка «fx» для добавления выражений. -вниз.
Doug_Ivison

Кроме того, вместо создания UDF для анализа, если значение базы данных и значения параметров надежно уникальны и никогда не являются подмножествами друг друга, я пропускаю синтаксический анализ и просто использую CHARINDEX: например, если код для чтения параметра во встроенном SQL был : WHERE <Table>.[<Column>] IN (@MultiValueParm), тогда код в хранимой процедуре может бытьWHERE CHARINDEX(<Table>.[<Column>], @MultiValueParmAsText) > 0
Doug_Ivison

Отличная Q & A, спасибо! К вашему сведению, SQLFool.com, кажется, не работает. Функцию ParseString () можно найти по адресу: github.com/MichelleUfford/sql-scripts/blob/master/dev/…
J Weezy,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.