是否有一个存储过程调用其他存储过程不好?

Bob*_*tor 4 sql sql-server

我正在尝试使一个长存储过程更易于管理,有一个存储过程调用其他存储过程是错误的例如我想有一个sproc将数据插入表中并根据类型插入其他信息进入该类型的表,如:

BEGIN TRANSACTION

        INSERT INTO dbo.ITSUsage (
            Customer_ID,
            [Type],
            Source
        ) VALUES ( 
            @Customer_ID,
            @Type,
            @Source
            )
    SET @ID = SCOPE_IDENTITY()  

    IF @Type = 1
        BEGIN
                  exec usp_Type1_INS @ID, @UsageInfo 
            END
        IF @TYPE = 2
                BEGIN
                  exec usp_Type2_INS @ID, @UsageInfo 
            END

    IF (@@ERROR <> 0)
        ROLLBACK TRANSACTION
    ELSE
        COMMIT TRANSACTION      
Run Code Online (Sandbox Code Playgroud)

或者这是我应该在我的应用程序中处理的东西?

Joe*_*Joe 12

我们一直调用来自其他过程的过程.否则,很难/不可能分割数据库密集型(或仅限数据库)的应用程序.

  • 同意,但是如果父proc可能会回滚,请注意调用链中可能需要或需要执行提交的proc. (2认同)

Rem*_*anu 9

从另一个程序内部调用过程是完全可以接受的.

但是,在依赖于@@ ERROR的Transact-SQL中容易出现故障.例如,您的代码.它将无法检测到插入失败,以及在被调用过程中产生的任何错误.这是因为@@ ERROR在每个语句执行时被重置,只保留最后一个语句的结果.我有一个博客条目,显示Transact-SQL和事务嵌套中的错误处理正确模板.另外,Erland Sommarskog有一篇文章,很长一段时间以来,它都是关于Transact-SQL中错误处理参考文献.