Buenos días y gracias desde ya. Leí anonimamente por mucho tiempo la web, y aquí estoy con mi primer duda.
El inconveniente lo tengo al ejecutar una cadena por medio de
sp_executesqlEl código es un tanto extenso y muy poco ortodoxo, lo sé, es por eso que les comento la idea.
Es un proceso almacenado a ejecutarse periódicamente. El SP acepta 3 variables las cuales son
sector,
unidad y
pcrc. Luego declaro una cadena a ejecutarse, esta cadena va a comparar datos de una tabla con la misma tabla copiada del periodo anterior. La idea es sacar casos "nuevos" que hayan ingresado en esta ultima actualización. El código que realiza esto funciona a la perfección. Lo he probado sin hacer el Store Procedure dinámico y anduvo sin problema.
El inconveniente lo tengo aquí ahora en la parte final (
update) cuando intento realizar todo desde la cadena (quiero aclarar que el update siempre anduvo sin problemas. Como recién dije, el inconveniente se presenta ahora al ejecutarse como un SP dinámico)
Aquí va el código.
------------------------------------------------------------------
CREATE PROCEDURE SP_TIEMPO_MEDIO_XHORA
@sector nvarchar(20),
@unidad nvarchar(20),
@pcrc nvarchar(20)
as
declare @cadena nvarchar(3000)
declare @select nvarchar(1000)
declare @update nvarchar(1000)
set @update = 'update tiempo_medio set ingresos_del_dia = ingresos_del_dia + @bandera, total = ingresos_del_dia + inicio WHERE fecha = (CONVERT (nvarchar(15), getdate(),103)) and un = ''' +@unidad+ ''' and sector = ''' +@sector+ ''' and pcrc = ''' +@pcrc+ ''''
set @select = 'select linea, fecha_instancia from tmo_total where unidad = ''' +@unidad+ ''' and bo = ''' +@sector+ ''' and gestion = ''' +@pcrc+ ''''
--comienzo cadenaset @cadena = 'declare @linea nvarchar(10), @fecha datetime, @linea_v nvarchar(10), @fecha_v datetime
DECLARE @Cursor CURSOR
declare @bandera int
set @bandera = 0
set @cursor = cursor for ' +@select+ '
open @cursor
FETCH NEXT FROM @cursor into @linea, @fecha
WHILE @@FETCH_STATUS = 0
BEGIN
set @linea_v = (select linea from tmo_total_copia where linea = @linea and fecha_instancia = @fecha)
set @fecha_v = (select fecha_instancia from tmo_total_copia where linea = @linea and fecha_instancia = @fecha)
if (@linea_v IS NULL and @fecha_v IS NULL)
begin
set @bandera = @bandera + 1
end
FETCH NEXT FROM @Cursor
INTO @linea, @fecha
END;
EXEC sp_executesql ' +@update+ ' --aqui tiraría el error aparentemente
CLOSE @Cursor;
DEALLOCATE @Cursor;
' --fin cadenaEXEC sp_executesql @cadena
GO
------------------------------------------------------------------
Ejecuto el SP con lo siguiente.
exec sp_tiempo_medio_xhora bo, negocios, diag --bo, negocios, diag son los parametros que le proveo al sp.
y el error es el siguiente
Msg 201, Level 16, State 10, Procedure sp_executesql, Line 20
Procedure 'sp_executesql' expects parameter '@statement', which was not supplied.He googleado el error en busca de pistas pero no eh encontrado nada. Quiero aclarar que probé variantes para el problema. Intenté declarar y setear la variable
update dentro de
cadena, pero he obtenido también un error.
Cualquier ayuda es bienvenida. Gracias