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

enyaitl3  于 2022-12-17  发布在  SQL Server
关注(0)|答案(1)|浏览(604)

当我通过SQL Server Mgmt Studio执行插入查询批处理时,它产生了以下错误,但完成了其他查询的插入过程。
消息18054,级别16,状态1,程序X,第14行
引发了错误50001,严重性-1,状态1,但在sys. messages中找不到具有该错误号的消息。如果error大于50000,请确保使用sp_addmessage添加用户定义的消息。
消息18054,级别16,状态1,程序Y,第14行
引发了错误50001,严重性-1,状态1,但在sys. messages中找不到具有该错误号的消息。如果error大于50000,请确保使用sp_addmessage添加用户定义的消息。
消息18054,级别16,状态1,程序Z,第14行
引发了错误50001,严重性-1,状态1,但在sys. messages中找不到具有该错误号的消息。如果error大于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.

什么样的方法可以使过程抛出错误得到处理,并继续插入,直到像SQL客户端的结束。

q0qdq0h2

q0qdq0h21#

再想想你想问的问题,我想你的问题的答案是:
您需要将可能导致您希望忽略的错误的EACH语句放在它自己的TRY..CATCH块中。在每个catch块中,您可以根据错误消息决定是要THROW它并停止处理,还是什么也不做,而是将它存储在变量中,然后继续。
然后,在所有操作结束时,您可以检查变量,查看是否有任何您忽略的错误,并在此时将它们抛出(如果您愿意的话),而无需回滚已经成功运行的语句。

相关问题