在SQL Server中运行查询时忽略或处理错误

时间:2017-08-30 17:32:41

标签: sql sql-server sql-server-2008

当我通过SQL Server Mgmt Studio执行一批插入查询时,会产生以下错误,但会完成其他查询的插入过程。

  

Msg 18054,Level 16,State 1,Procedure X,Line 14
  错误50001,严重性-1,状态1被引发,但在sys.messages中找不到具有该错误号的消息。如果错误大于50000,请确保使用sp_addmessage添加用户定义的消息。

     

Msg 18054,Level 16,State 1,Procedure Y,Line 14
  错误50001,严重性-1,状态1被引发,但在sys.messages中找不到具有该错误号的消息。如果错误大于50000,请确保使用sp_addmessage添加用户定义的消息。

     

Msg 18054,Level 16,State 1,Procedure Z,Line 14
  错误50001,严重性-1,状态1被引发,但在sys.messages中找不到具有该错误号的消息。如果错误大于50000,请确保使用sp_addmessage添加用户定义的消息。

但是,在终端插入查询中通过ant作业执行时,进程将停止并显示以下错误消息。

BUILD FAILED
C:\test\mssql\build.xml:27: The following error occurred while executing this line:
C:\test\mssql\build-core.xml:74: com.microsoft.sqlserver.jdbc.SQLServerException: Error 50001, 
severity -1, state 1 was raised, but no message with that error number was found in sys.messages. If error is larger than 50000, 
make sure the user-defined message is added using sp_addmessage.
        at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)
        at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515)

我试图忽略它来处理错误:

set ANSI_WARNINGS OFF;

通过为抛出错误的过程定义try-catch块:

BEGIN TRY  
    RAISERROR (50001,-1,1, 'X');
    RAISERROR (50001,-1,1, 'Y');
    RAISERROR (50001,-1,1, 'Z');
END TRY  
BEGIN CATCH  
    DECLARE @ErrorMessage NVARCHAR(4000);  
    DECLARE @ErrorSeverity INT;  
    DECLARE @ErrorState INT;  

    SELECT   
        @ErrorMessage = ERROR_MESSAGE(),  
        @ErrorSeverity = ERROR_SEVERITY(),  
        @ErrorState = ERROR_STATE();  
    RAISERROR (@ErrorMessage, -- Message text.  
               @ErrorSeverity, -- Severity.  
               @ErrorState -- State.  
               );  
END CATCH;  

但是在构建失败的终端中错误仍然存​​在。

如果我定义自定义错误消息如下:

EXEC sp_addmessage 50001, 16, N'Test Message'; 
GO

我刚收到上述错误消息代替but no message with that error number was found in sys.messages. If error is larger than 50000, make sure the user-defined message is added using sp_addmessage.

enter image description here

可能会出现如何处理抛出错误的过程,并且像SQL客户端一样继续插入到最后。

enter image description here

1 个答案:

答案 0 :(得分:0)

想一想你必须要问什么,我认为你的问题的答案是:

您需要在其自己的TRY..CATCH块中放置可能导致您想要忽略的错误的EACH语句。在每个catch块中,您可以根据错误消息决定是否要删除它并停止处理,或者只是将其存储在变量中,然后继续。

然后在所有内容结束时,您可以检查您的变量,看看是否有任何您忽略的错误,并在那时将它们删除(如果您愿意),而不回滚已经运行的语句成功。