是否可以检测当前存储过程是否被INSERT-EXEC
语句调用?
是的,我知道我们可能不想再使用INSERT-EXEC
语句……这不是我要问的问题。
我使用的原因INSERT-EXEC
是因为我希望促进存储过程的重用,而不是一直重写相同的 SQL。
这就是我关心的原因:
在这种情况下,一旦请求INSERT-EXEC
a ,原始错误消息就会丢失。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