【问题标题】:calling EXEC() generates error: could not find stored procedure调用 EXEC() 生成错误:找不到存储过程
【发布时间】:2023-03-30 16:08:01
【问题描述】:

我需要对仅在运行时知道名称的表调用删除操作。

我有一个存储过程,它使用表名和条件动态地制定删除语句,然后将该字符串作为参数传递给 EXEC() 函数(显然,所有这些都在事务中)。

当我运行存储过程时出现错误 - 找不到存储过程 - 指的是我动态制定并发送到 EXEC() 的语句。

这是我的代码:

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

...

这是错误:

找不到存储过程'DELETE FROM myTable WHERE id = 1111'

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    EXEC 不带括号尝试调用过程。

    试试EXEC(@dynDelete)

    【讨论】:

      【解决方案2】:

      你需要写
      执行(@dynDelete)

      【讨论】:

        【解决方案3】:

        使用EXEC()EXECUTE() 执行您的Sql Query,如下所示:

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

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

        【讨论】:

          【解决方案4】:

          如果使用 EXEC,则从 SqlDataSource 中删除 DeleteCommandType

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-09
            • 2017-10-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多