Como passar caracteres com vários valores no relatório SSRS?


8

Eu tenho um relatório do SSRS que possui 3 conjuntos de dados que se alimentam de uma fonte de dados. O conjunto de dados principal é um procedimento armazenado que agrega alguns dados com base em um conjunto de parâmetros alimentados pelos outros dois conjuntos de dados.

O principal procedimento armazenado que alimenta este relatório possui 4 parâmetros. Um é um ID para o tipo de dados, dois são para datas de início e término e o terceiro é apenas um parâmetro de flag. O parâmetro flag é o parâmetro com vários valores em que desejo passar vários valores de flag que também são valores VARCHAR.

No meu procedimento armazenado para o meu parâmetro @Flag, tenho o comum:

WHERE [Flag] IN (@Flag)

Obviamente, o parâmetro @Flag no relatório SSRS definido para permitir 'Múltiplos Valores' que também são preenchidos a partir de uma consulta que está puxando esses valores @Flag de uma tabela de dimensões.

Meu problema

Na maioria dos casos, ao lidar com valores INT, a mesma técnica funciona. No entanto, quando estou lidando com valores de caracteres, ele falha. Se eu escolher um sinalizador, o relatório funcionará magicamente. Se eu selecionar mais de um sinalizador, ele não passará os sinalizadores corretamente para o procedimento armazenado e nenhum resultado será retornado.

Ao testar o sinalizador de vários valores diretamente no procedimento armazenado:

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

O procedimento armazenado funciona corretamente. Portanto, o problema não é o procedimento armazenado, mas como o SSRS está passando os valores com vários valores para o parâmetro @Flag.

Soluções experimentadas

Tentei fazer os seguintes ajustes no conjunto de dados SSRS para esses parâmetros @Flag:

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

E este também:

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

Todos eles trabalham com valores únicos, mas nunca com valores múltiplos.

O que estou perdendo aqui?

Respostas:


7

Eu encontrei uma solução. Não dividi adequadamente os valores no procedimento armazenado com um UDF.

Para passar vários valores corretamente neste procedimento armazenado, eu precisaria adicionar o seguinte código ao parâmetro do conjunto de dados que estou usando:

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

Basicamente, isso vai unir vários valores em uma matriz e passá-lo através do @Flagparâmetro A próxima etapa é adicionar SQL ao procedimento armazenado para receber e digerir os valores corretamente, para que ele leia os valores com a INcláusula

O Google pesquisa on-line qualquer analisador de string UDF. Há muitos por onde escolher. Eu usei dba_parseString_udfem Michelle Ufford http://sqlfool.com .

Depois de instalar meu UDF, agora posso alterar minha INcláusula para receber o novo parâmetro de vários valores sendo passado pelo SSRS da seguinte maneira:

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

Portanto, o SSRS passará o seguinte valor:

@Flag = 'A,B,C'

Em seguida, meu UDF analisará essa sequência corretamente para:

A
B
C

E preencha meu @Flagparâmetro corretamente comSELECT * FROM UDF()...


Caso isso ajude outras pessoas: a expressão de junção ( =join(Parameters!<your param name>.Value,",")) pode ser adicionada ao conjunto de dados que o parâmetro, na guia "Parâmetros": existe um botão "fx" para adicionar expressões, à direita do menu suspenso "Valor do parâmetro" -baixa.
Doug_Ivison

Além disso, em vez de criar um UDF para analisar, se o valor do banco de dados e os parâmetros forem confiáveis e únicos e nunca subconjuntos um do outro, pulo a análise e apenas uso CHARINDEX: por exemplo, se o código para ler o parâmetro no SQL incorporado for : WHERE <Table>.[<Column>] IN (@MultiValueParm), em seguida, o código no procedimento armazenado poderia serWHERE CHARINDEX(<Table>.[<Column>], @MultiValueParmAsText) > 0
Doug_Ivison

Ótimas perguntas e respostas, obrigado! Para sua informação, o SQLFool.com parece estar inativo. A função ParseString () pode ser encontrada em: github.com/MichelleUfford/sql-scripts/blob/master/dev/...
J Weezy
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.