2011-12-05 41 views
11

Tôi cần gọi một lệnh xóa trên một bảng có tên sẽ chỉ được biết khi chạy.gọi EXEC() tạo ra lỗi: không thể tìm thấy thủ tục được lưu trữ

Tôi có một thủ tục được lưu trữ để xây dựng câu lệnh xóa với tablename và tiêu chí động, và sau đó chuyển chuỗi đó làm đối số cho hàm EXEC() (tất cả điều này nằm trong giao dịch).

Khi tôi chạy thủ tục đã lưu, tôi gặp lỗi - không thể tìm thấy quy trình được lưu trữ - tham chiếu đến câu lệnh tôi đã tạo động và gửi đến EXEC().

Dưới đây là mã của tôi:

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 

...

Dưới đây là các lỗi:

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

Trả lời

18

EXEC không có ngoặc vuông cố gắng gọi một thủ tục.

Hãy thử EXEC(@dynDelete)

3

Bạn cần phải viết
EXEC (@dynDelete)

1

Sử dụng EXEC() hoặc EXECUTE() để thực hiện truy vấn SQL của bạn như sau:

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

HOẶC

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

Xóa DeleteCommandType khỏi SqlDataSource nếu sử dụng EXEC

Các vấn đề liên quan