¿Cómo pasar caracteres de valores múltiples en el Informe SSRS?

8

Tengo un informe SSRS que tiene 3 conjuntos de datos que se alimentan de una fuente de datos. El conjunto de datos principal es un procedimiento almacenado que agrega algunos datos en función de un conjunto de parámetros impulsados ​​por los otros dos conjuntos de datos.

El procedimiento almacenado principal que alimenta este informe tiene 4 parámetros. Uno es una ID para el tipo de datos, dos son para las fechas de inicio y finalización y el tercero es solo un parámetro de marca. El parámetro de marca es el parámetro de valores múltiples donde quiero pasar varios valores de marca que también son valores VARCHAR.

En mi procedimiento almacenado para mi parámetro @Flag, tengo lo común:

WHERE [Flag] IN (@Flag)

Luego, por supuesto, el parámetro @Flag en el conjunto de informes SSRS para permitir 'Valores múltiples' que también se completan a partir de una consulta que extrae esos valores @Flag de una tabla de dimensiones.

Mi problema

En la mayoría de los casos cuando se trata con valores INT, funciona la misma técnica. Sin embargo, cuando estoy tratando con valores de caracteres, falla. Si elijo una bandera, el informe funciona mágicamente. Si selecciono más de un indicador, no parece pasar los indicadores correctamente al procedimiento almacenado y no se devuelven resultados.

Al probar el indicador de valor múltiple directamente en el procedimiento almacenado:

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

El procedimiento almacenado funciona correctamente. Entonces, el problema no es el procedimiento almacenado, sino cómo SSRS está pasando los valores de valores múltiples al parámetro @Flag.

Soluciones probadas

Intenté hacer los siguientes ajustes en el conjunto de datos SSRS para estos parámetros de @Flag:

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

Y éste también:

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

Todos estos funcionan en valores únicos, pero nunca en valores múltiples.

¿Que me estoy perdiendo aqui?

Fastidioso
fuente

Respuestas:

7

Encontré una solución. No dividí correctamente los valores en el procedimiento almacenado con un UDF.

Para pasar los valores múltiples correctamente en este procedimiento almacenado, necesitaría agregar el siguiente código al parámetro del conjunto de datos que estoy usando:

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

Básicamente, esto unirá múltiples valores en una matriz y lo pasará a través del @Flagparámetro. El siguiente paso es agregar SQL al procedimiento almacenado para recibir y digerir los valores correctamente para que lea los valores con la INcláusula.

Google busca cualquier analizador de cadenas UDF en línea. Hay muchos para elegir. Solía dba_parseString_udfde Michelle Ufford http://sqlfool.com .

Una vez que instalé mi UDF, ahora puedo modificar mi INcláusula para recibir el nuevo parámetro de valores múltiples que pasa SSRS de la siguiente manera:

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

Por lo tanto, SSRS pasará el siguiente valor:

@Flag = 'A,B,C'

Entonces mi UDF analizará esa cadena correctamente para:

A
B
C

Y llenar mi @Flagparámetro correctamente conSELECT * FROM UDF()...

Fastidioso
fuente
En caso de que esto ayude a alguien más: la expresión de unión ( =join(Parameters!<your param name>.Value,",")) se puede agregar al conjunto de datos que lee el parámetro, en la pestaña "Parámetros": hay un botón "fx" para agregar expresiones, a la derecha de la caída del "Valor del parámetro" -abajo.
Doug_Ivison
Además, en lugar de crear un UDF para analizar, si el valor de la base de datos y los valores de los parámetros son confiablemente únicos y nunca se configuran entre sí, entonces omito el análisis y solo uso CHARINDEX: por ejemplo, si el código para leer el parámetro en el SQL incorporado fue : WHERE <Table>.[<Column>] IN (@MultiValueParm), entonces el código en el procedimiento almacenado podría serWHERE CHARINDEX(<Table>.[<Column>], @MultiValueParmAsText) > 0
Doug_Ivison
Gran Q&A, gracias! Para su información, SQLFool.com parece estar caído. La función ParseString () se puede encontrar en: github.com/MichelleUfford/sql-scripts/blob/master/dev/…
J Weezy