【发布时间】:2026-01-25 23:35:02
【问题描述】:
是否可以检测当前存储过程是否被INSERT-EXEC 语句调用?
是的,我知道我们可能不想再使用INSERT-EXEC 语句...这不是我要问的问题。
我使用INSERT-EXEC 的原因是因为我希望促进存储过程的重用,而不是一直重写相同的 SQL。
这就是我关心的原因:
在INSERT-EXEC 场景下,一旦请求ROLLBACK,原始错误消息就会丢失。因此,现在创建的任何记录都将成为孤立记录。
示例:
ALTER PROCEDURE [dbo].[spa_DoSomething]
(
@SomeKey INT,
@CreatedBy NVARCHAR(50)
)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION
-- SQL runs and throws an error of some kind.
COMMIT TRAN
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN
-- If this procedure is called using an INSERT-EXEC
-- then the original error will be lost at this point because
-- "Cannot use the ROLLBACK statement within an INSERT-EXEC statement."
-- will come-up instead of the original error.
SET @ErrorMessage = ERROR_MESSAGE();
SET @ErrorSeverity = ERROR_SEVERITY();
SET @ErrorState = ERROR_STATE();
RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState)
END CATCH
RETURN @@Error
END
【问题讨论】:
标签: sql sql-server error-handling raiserror