SQL Server : retrieving stored procedure errors and use them

标签 sql sql-server tsql stored-procedures sql-server-2016

我正在尝试从不同的存储过程中获取错误。

例如,用户尝试将重复的产品 ID 添加到表中;这将失败并且会引发重复键错误。如果用户尝试插入NULL,也会失败。

如何获取这些错误并识别它们,以便我可以使用该错误来显示不同的错误消息?我知道我可以将错误放在输出参数上,但我不知道如何识别发生了哪个错误。

使用 SQL Server 2016

最佳答案

您可以使用TRY CATCH block 来处理错误。一般来说,您可以使用以下模板:

BEGIN TRY

    BEGIN TRANSACTION;
    -- CODE BLOCK GOES HERE
    COMMIT TRANSACTION;

END TRY
BEGIN CATCH; 

   IF @@TRANCOUNT > 0
   BEGIN
      ROLLBACK TRANSACTION;
   END;

   -- GET ERRORS DETAILS OR THROW ERROR

END CATCH;

如果您没有使用TRANSACTION,它将如下所示:

BEGIN TRY

    -- CODE BLOCK GOES HERE

END TRY
BEGIN CATCH; 

   -- GET ERRORS DETAILS OR THROW ERROR

END CATCH;

CATCH block 中,您可以使用一些内置函数获取错误详细信息。例如:

BEGIN TRY  
    -- Generate a divide-by-zero error.  
    SELECT 1/0;  
END TRY  
BEGIN CATCH  
    SELECT  
        ERROR_NUMBER() AS ErrorNumber  
        ,ERROR_SEVERITY() AS ErrorSeverity  
        ,ERROR_STATE() AS ErrorState  
        ,ERROR_PROCEDURE() AS ErrorProcedure  
        ,ERROR_LINE() AS ErrorLine  
        ,ERROR_MESSAGE() AS ErrorMessage;  
END CATCH;  
GO  

然后,根据这些详细信息,您可以执行某些操作(记录错误,不执行任何操作,将错误详细信息保存在变量中并将其传递到外部例程,使用 THROW 生成相同的错误,或再次使用 THROW - 生成一些您的自定义THROW 51000, 'My Custom error message.', 1;.

关于SQL Server : retrieving stored procedure errors and use them,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54758521/

相关文章:

sql - T-SQL : How to use parameters in dynamic SQL?

sql - MySql表设计: multiple tables vs.多列

sql - 如何获取我需要的时间格式?

PHP-Mysql 查询

sql - 如何在SQL 2000/2005上将链接服务器设置为Oracle数据库?

sql - 在一个语句中选择并分配给变量?

mysql - 插入到 phpmyadmin 上的触发器

php - 如何合并表中两列的两个值。

SQL 两个表并创建链接表

sql - 使用 "with as"的输出几次