2011-12-05 15 views
11

Muszę wywołać usuwanie na tabeli, którego nazwa będzie znana tylko w czasie wykonywania.wywoływanie EXEC() generuje błąd: nie można znaleźć procedury przechowywanej

Mam procedurę składowaną, która formułuje instrukcję delete z tablename i kryteriami dynamicznie, a następnie przekazuje ten ciąg jako argument do funkcji EXEC() (oczywiście wszystko jest w ramach transakcji, oczywiście).

Po uruchomieniu procedury przechowywanej pojawia się błąd - nie można znaleźć procedury składowanej - odwołując się do instrukcji sformułowanej dynamicznie i wysłanej do EXEC().

Oto mój kod:

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 

...

Oto błąd:

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

Odpowiedz

18

EXEC bez nawiasów próbuje wywołać procedurę.

Spróbuj EXEC(@dynDelete)

3

Musisz napisać
exec (@dynDelete)

1

Korzystając EXEC() lub EXECUTE() wykonywać swoje zapytanie SQL jak poniżej:

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

LUB

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

Usuń DeleteCommandType z SqlDataSource, jeśli jest używane EXEC

Powiązane problemy