【发布时间】:2017-08-17 14:54:27
【问题描述】:
我需要经常使用TRY..CATCH 块执行存储过程。
因此,我写了一个包含TRY..CATCH块+输入参数的存储过程:
CREATE PROCEDURE [dbo].[exec_sp_with_try_catch]
(@pnvcSPName NVARCHAR(100))
AS
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
BEGIN
BEGIN TRY
exec @pnvcSPName;
END TRY
BEGIN CATCH
SELECT @ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR(@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION;
END CATCH
END;
那么我可以直接使用上面的存储过程,如果我想用try...catch块执行一个存储过程:
exec [dbo].[exec_sp_with_try_catch] @pnvcSPName = '[dbo].[another_sp]';
但是上述方法只有在我们不使用[dbo].[another_sp]中的任何参数时才有效。
如果我们在[dbo].[another_sp]中使用参数:
exec [dbo].[exec_sp_with_try_catch] @pnvcSPName = '[dbo].[another_sp] @para = ''K''';
它会抛出以下错误:
消息 50000,级别 16,状态 2,过程 exec_sp_with_try_catch,第 30 行
名称 '[dbo].[another_sp] @para = 'K'' 不是有效标识符。
为什么,以及如何纠正?
【问题讨论】:
标签: sql-server