Principales respuestas
Como leer parámetros de entrada de un procedimiento almacenado desde un sql dinámico

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
- Propuesto como respuesta Pablo RubioModerator martes, 20 de noviembre de 2018 15:57
- Marcado como respuesta Pablo RubioModerator lunes, 26 de noviembre de 2018 18:27
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
Un saludo
- Propuesto como respuesta Pablo RubioModerator lunes, 19 de noviembre de 2018 19:23
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)
- Editado Leandro Vanegas lunes, 19 de noviembre de 2018 21:06
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
- Propuesto como respuesta Pablo RubioModerator martes, 20 de noviembre de 2018 15:57
- Marcado como respuesta Pablo RubioModerator lunes, 26 de noviembre de 2018 18:27
martes, 20 de noviembre de 2018 7:26