2011-12-05 12 views
11

Necesito llamar a una eliminación en una tabla cuyo nombre solo se conocerá en tiempo de ejecución.llamando a EXEC() genera error: no se pudo encontrar el procedimiento almacenado

Tengo un procedimiento almacenado que formula dinámicamente la declaración de eliminación con nombre de tabla y criterios, y luego pasa esa cadena como un argumento a la función EXEC() (obviamente, todo está dentro de una transacción).

Cuando ejecuto el procedimiento almacenado obtengo un error - no pude encontrar el procedimiento almacenado - refiriéndome a la declaración que formulé dinámicamente y envié a EXEC().

Aquí está mi código:

DECLARE @dynTab AS varchar(50), @dynDelete AS varchar(255) 
    DECLARE @crsr CURSOR 
    SET @crsr = CURSOR FAST_FORWARD 
    FOR 
    SELECT dyn_tablename FROM dyn_tab WHERE dyn_doc_type_id IN (SELECT doc_id FROM tree_tab WHERE id = @id) AND dyn_tablecreated = 1 

OPEN @crsr 
FETCH NEXT FROM @crsr 
INTO @dynTab 

WHILE @@FETCH_STATUS = 0 AND @@ERROR = 0 
    BEGIN 
     SET @dynDelete = 'DELETE FROM ' + @dynTab + ' WHERE id = ' + @id 
     EXEC @dynDelete 

     FETCH NEXT FROM @crsr 
     INTO @dynTab 
    END 

      CLOSE @crsr 
     DEALLOCATE @crsr 
     IF @@ERROR <> 0 
     BEGIN 
      ROLLBACK TRAN 
      return 0 
     END 

...

Aquí está el error:

Could not find stored procedure 'DELETE FROM myTable WHERE id = 1111'

Respuesta

18

EXEC sin paréntesis intenta llamar a un procedimiento.

Trate EXEC(@dynDelete)

3

Usted tiene que escribir
EXEC (@dynDelete)

1

Uso EXEC() o EXECUTE() para ejecutar su consulta SQL de la siguiente manera:

SET @dynDelete = 'DELETE FROM ' + @dynTab + ' WHERE id = ' + @id 
EXEC(@dynDelete) 

O

SET @dynDelete = 'DELETE FROM ' + @dynTab + ' WHERE id = ' + @id 
EXECUTE(@dynDelete) 
1

Eliminar DeleteCommandType de SqlDataSource si se usa EXEC

Cuestiones relacionadas