【问题标题】:Catch error message from stored procedure从存储过程中捕获错误消息
【发布时间】:2016-09-23 09:50:05
【问题描述】:

如何捕获错误消息等“将数据类型 varchar 转换为日期时间时出错”

这个错误放在选择输出中

BEGIN
    SET NOCOUNT ON;

     begin try 
        UPDATE projects
        SET 
            projectUser = @projectUser,
            projectStartDate = @projectStartDate
        where projectId = @projectId
        SELECT 'OK'
     end try

     begin catch
        SELECT 'ERROR - msg error'
     end catch    

    COMMIT

END

我不需要 ==> https://postimg.org/image/u8mohtl9b/

有什么办法吗?

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。还显示导致代码失败的示例数据。
  • 标记您正在使用的 dbms。 (看起来像产品特定代码。)
  • 与其担心如何捕获错误消息,不如修复它。我可以看到您可能会引发此错误的最有可能的方式是 @projectStartDate 是否作为 varchar 传递给过程/查询。只需更改参数的数据类型以匹配列的数据类型,您就解决了问题。如果您坚持使用错误的数据类型并处理错误,那么您可以使用ERROR_MESSAGE() 来捕获它。
  • @jarlh SQL 2012
  • 我想要结果为postimg.org/image/lkgzwmq4f

标签: sql stored-procedures sql-server-2012


【解决方案1】:

您遇到的问题是程序中没有发生错误,它是在调用程序时发生的。在一个简单的示例中,创建以下过程:

IF OBJECT_ID(N'dbo.ErrorCatchTest', 'P') IS NOT NULL
    DROP PROCEDURE dbo.ErrorCatchTest;
GO
CREATE PROCEDURE dbo.ErrorCatchTest @int INT
AS
BEGIN
    SET NOCOUNT ON;
    BEGIN TRY
        DECLARE @T TABLE (I INT);
        INSERT @T (I) VALUES (5.0 / @int);

        SELECT 'OK';
    END TRY
    BEGIN CATCH
        SELECT CONCAT('Error_Message: ', ERROR_MESSAGE());
    END CATCH
END;

如果我将有效的INT 传递给程序:

EXECUTE dbo.ErrorCatchTest @int = 1;

我根据需要得到OK

如果我通过0 强制出错:

EXECUTE dbo.ErrorCatchTest @int = 0;

您会根据需要收到错误消息,但如果我尝试传递一个无效整数:

EXECUTE dbo.ErrorCatchTest @int = 'Not a number';

然后我收到错误消息,因为错误不在程序内,而是在对参数进行隐式转换时。

解决这个问题的方法是在 try/catch 块中调用过程:

BEGIN TRY
    EXECUTE dbo.ErrorCatchTest @int = 'Not a number';
END TRY
BEGIN CATCH
    SELECT CONCAT('Error_Message: ', ERROR_MESSAGE()); 
END CATCH

【讨论】:

    【解决方案2】:

    您可以选择如下错误消息...

    Begin Catch     
          SELECT 'Error_Message: ' + ERROR_MESSAGE() + ' Error_Line: ' + ERROR_LINE() AS ErrorMessage    
    End Catch 
    

    【讨论】:

      【解决方案3】:

      如果您只需要错误消息,请使用以下脚本。

      BEGIN CATCH
      SELECT 'Error_Message :'+ERROR_MESSAGE()
      END CATCH
      

      样本输出:

      【讨论】:

      猜你喜欢
      • 2012-05-04
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      相关资源
      最近更新 更多