none
Como leer parámetros de entrada de un procedimiento almacenado desde un sql dinámico RRS feed

  • Pregunta

  • Buenas,

    Actualmente estoy desarrollando un procedimiento almacenado, en el cual servirá para la impresión genérica de reportes. En este procedimiento se pretende leer una parametrización donde esta configurado que tipo de reporte y que variables se deben imprimir. El procedimiento almacenado tiene declarado todas los parámetros de entrada para todos los reportes configurados. Por la cual es necesario leer la tabla detallada abajo  y con un SQL dinámico leer los parámetros de entrada del procedimiento.

    Ejemplo (Tabla de configuración):

    Tipo de Reporte  |  Variables      |  Etiquetas 

    Reporte1                @variable1      Etiqueta1

    Reporte1                @variable2      Etiqueta2

    Reporte1                @variable3      Etiqueta3

    Reporte2                @variable1      Etiqueta1

    Reporte2                @variable2      Etiqueta2

    Reporte2                @variable3      Etiqueta3

    ...

    Ejemplo de código (Este código funciona en Sybase, en SQL Server no funciona):

    --Para variable 1

    select @w_parametro_sp = '@variable1' --se obtiene de la tabla de parametrización

    select @sproc = "select @w_valor_reemplazo   = convert(varchar," + @w_parametro_sp+")"

     execute (@sproc)

    --Para variable 2

    select @w_parametro_sp = '@variable2'  --se obtiene de la tabla de parametrización

    select @sproc = "select @w_valor_reemplazo   = convert(varchar," + @w_parametro_sp+")"

     execute (@sproc)

    --Para variable 3

    select @w_parametro_sp = '@variable3'  --se obtiene de la tabla de parametrización

    select @sproc = "select @w_valor_reemplazo   = convert(varchar," + @w_parametro_sp+")"

     execute (@sproc)

    Ejemplo de Reporte 1:

    Etiqueta 1:      Variable1

    Etiqueta 2:      Variable2

    Etiqueta 3:      Variable3


    lunes, 19 de noviembre de 2018 17:41

Respuestas

  • Hola Leandro Vanegas:

    Si se puede hacer en SQL Server.

    declare @query nvarchar(400);
    declare @salida nvarchar(100);
    declare @variableEntrada nvarchar(100);
    DECLARE @valor1			NVARCHAR(10),
    		         @valor2			NVARCHAR(10),
    				 @valor3			NVARCHAR(10);
    				SET @valor1 = N'Texto 1' 
    				SET @valor2 = N'Texto 2'
    				SET @valor3 = N'Texto 3'
    declare @parametros nvarchar(100);
    SET @PARAMETROS = N'@variableEntrada Nvarchar(100), @salida nvarchar(max) OUTPUT';
    
    set @variableEntrada = @valor1;
    
    SET @query = 'declare @tabla table (variable nvarchar(100));
    insert into @tabla (variable) values (@variableEntrada)
    SELECT @salida = variable FROM @tabla'
    	 
         
                    EXEC sp_executesql @Query, @PARAMETROS, @variableEntrada, @salida OUTPUT;
    select @salida
    ----------------
    set @variableEntrada = @valor2;
    
    SET @query = 'declare @tabla table (variable nvarchar(100));
    insert into @tabla (variable) values (@variableEntrada)
    SELECT @salida = variable FROM @tabla'
    	            EXEC sp_executesql @Query, @PARAMETROS, @variableEntrada, @salida OUTPUT;
    select @salida
    ----------------
    set @variableEntrada = @valor3;
    
    SET @query = 'declare @tabla table (variable nvarchar(100));
    insert into @tabla (variable) values (@variableEntrada)
    SELECT @salida = variable FROM @tabla'
                    EXEC sp_executesql @Query, @PARAMETROS, @variableEntrada, @salida OUTPUT;
    select @salida
    				

    Si no se puede por las buenas, pues por las malas. Como ves he utilizado una variable tipo tabla para obtener su valor, y con eso me quito la limitación.

    Salida

    Un saludo

    martes, 20 de noviembre de 2018 7:26

Todas las respuestas

  • Hola Leandro Vanegas:

    Tu idea, quizá no este del todo bien explicada.

    En sql Server en el procedimiento, puedes recibir variables, y trabajarlas a tu antojo dentro del mismo.

    Para poner un valor en una variable solo tienes que declarar y utilizar tu variable, por ejemplo

    declare @variable int; set @variable = (selec sum(campo) from tabla /*retornando un valor del tipo*/)

    o directamente declare @variable int= (select @miparametro1);

    Dentro del procedimiento, puedes recibir un nvarchar(max) con la sentencia dinamica, y luego un parametro int con el numero donde quieres extraer de la tabla de configuración.

    Pero tambien lo puedes hacer desde dentro del procedimiento, y es ahí donde montas tu nvarchar para ejecutar la cadena.

    y luego solo realizar un exec sp_executeSql .....  y enviarle los parametros que requiera.

    Exec sp_executeSQL

    https://docs.microsoft.com/es-es/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql?view=sql-server-2017

    Un saludo

    lunes, 19 de noviembre de 2018 18:30
  • Gracias Javi Fernandez por tu respuesta,

    Si, la idea no esta bien explicada. Es difícil de explicar. Tal vez me doy a entender:

    Lo que pasa es que en SYBASE si reconoce las variables declaradas fuera del SQL dinámico ejemplo las variables de entrada de un procedimiento almacenado. Quise hacer eso en SQL Server pero no es posible.

    Yo necesito leer el valor de las variables de entrada de un procedimiento, desde el SQL dinámico ya que cada reporte puede tener configurado variables deferentes. Entonces lo que hago es recorrer las variables de cada reporte y ejecutarlo en un SQL dinamico:

    select @w_parametro_sp = '@variable1' --se obtiene de la tabla de parametrización

    select @sproc = "select @w_valor_reemplazo   = convert(varchar," + @w_parametro_sp+")"

     execute (@sproc)


    lunes, 19 de noviembre de 2018 21:04
  • Hola Leandro Vanegas:

    Creo que tu inquietud sobre sql server es incorrecta.

    Con exec sp_executeSql se le pueden pasar parametros tanto de entrada como el mismo sobre la consulta ejecutada de salida.

    Además te diría, que en como me lo has presentado yo en realidad veo que con crear dos procedimientos almacenados, tienes suficiente.

    El primero el de tus reportes, cada uno recibe x variables, y prepara la sintaxis, que luego le pasa al segundo.

    El segundo el del Query dinámico, recibe lo parametrizado por los otros con un simple exec sp_dinamico @variableParametrizada y dentro del sp, ya ejecutas el query. Incluso el segundo es el que puede recibir la consulta dinámica.

    Fíjate en el enlace, que te puse, en el apartado B, para recibir parametros de entrada y en el C para utilizar parametros de salida.

    Desde mi experiencia, es cierto, que sp_executeSql es un poco engorroso con la parametrización dinámica, pero funciona genial.

    Míralo bien. Si no lo ves claro, intenta poner algo un poco más explicito de lo que tienes, y buscamos a ver si es posible.

    lunes, 19 de noviembre de 2018 21:23
  • Hola, gracias nuevamente por tu respuesta.

     Lo que se intenta realizar es lo siguiente:

    Que la variable @valorbuscar, puede servir como un puntero hacia cualquier otra variable y con el sql dinamico poder obtener valor de cada variable.

    Adjunto el script que corre a la perfección en SYBASE.


    SET NOCOUNT ON
    
     DECLARE @valor1			NVARCHAR(10),
             @valor2			NVARCHAR(10),
    		 @valor3			NVARCHAR(10),
    		 @sql				NVARCHAR(1000),
    		 @valorbuscar		NVARCHAR(10),
    		 @valor_reemplazo   NVARCHAR(10)
    
    
    SET @valor1 = 'Texto 1' 
    SET @valor2 = 'Texto 2'
    SET @valor3 = 'Texto 3'
    ---------------------------------------------------------------------------------------------------------
    select @valorbuscar = '@valor1' -- obtener valor de otra variable
    select @sql = 'select @valor_reemplazo   = convert(varchar,' + @valorbuscar+')'
    execute (@sql)
    
    SELECT @valor_reemplazo
    
    ---------------------------------------------------------------------------------------------------------
    select @valorbuscar = '@valor2' -- obtener valor de otra variable
    select @sql = 'select @valor_reemplazo   = convert(varchar,' + @valorbuscar+')'
    execute (@sql)
    
    SELECT @valor_reemplazo
    
    ---------------------------------------------------------------------------------------------------------
    select @valorbuscar = '@valor3' -- obtener valor de otra variable
    select @sql = 'select @valor_reemplazo   = convert(varchar,' + @valorbuscar+')'
    execute (@sql)
    
    SELECT @valor_reemplazo

    Este es el resultado de la ejecución de arriba en SYBASE:

    lunes, 19 de noviembre de 2018 22:09
  • Hola Leandro Vanegas:

    Si se puede hacer en SQL Server.

    declare @query nvarchar(400);
    declare @salida nvarchar(100);
    declare @variableEntrada nvarchar(100);
    DECLARE @valor1			NVARCHAR(10),
    		         @valor2			NVARCHAR(10),
    				 @valor3			NVARCHAR(10);
    				SET @valor1 = N'Texto 1' 
    				SET @valor2 = N'Texto 2'
    				SET @valor3 = N'Texto 3'
    declare @parametros nvarchar(100);
    SET @PARAMETROS = N'@variableEntrada Nvarchar(100), @salida nvarchar(max) OUTPUT';
    
    set @variableEntrada = @valor1;
    
    SET @query = 'declare @tabla table (variable nvarchar(100));
    insert into @tabla (variable) values (@variableEntrada)
    SELECT @salida = variable FROM @tabla'
    	 
         
                    EXEC sp_executesql @Query, @PARAMETROS, @variableEntrada, @salida OUTPUT;
    select @salida
    ----------------
    set @variableEntrada = @valor2;
    
    SET @query = 'declare @tabla table (variable nvarchar(100));
    insert into @tabla (variable) values (@variableEntrada)
    SELECT @salida = variable FROM @tabla'
    	            EXEC sp_executesql @Query, @PARAMETROS, @variableEntrada, @salida OUTPUT;
    select @salida
    ----------------
    set @variableEntrada = @valor3;
    
    SET @query = 'declare @tabla table (variable nvarchar(100));
    insert into @tabla (variable) values (@variableEntrada)
    SELECT @salida = variable FROM @tabla'
                    EXEC sp_executesql @Query, @PARAMETROS, @variableEntrada, @salida OUTPUT;
    select @salida
    				

    Si no se puede por las buenas, pues por las malas. Como ves he utilizado una variable tipo tabla para obtener su valor, y con eso me quito la limitación.

    Salida

    Un saludo

    martes, 20 de noviembre de 2018 7:26