Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中运行查询时忽略或处理错误_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

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

在SQL Server中运行查询时忽略或处理错误,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,当我通过SQLServerMgmtStudio执行批量插入查询时,它会产生以下错误,但会完成其他查询的插入过程 Msg 18054,16级,状态1,程序X,第14行 引发了错误50001,严重性为-1,状态为1,但在sys.messages中未找到具有该错误号的消息。如果错误大于50000,请确保使用sp_addmessage添加用户定义的消息 Msg 18054,16级,状态1,程序Y,第14行 引发了错误50001,严重性为-1,状态为1,但在sys.messages中未找到具有该错误号的消

当我通过SQLServerMgmtStudio执行批量插入查询时,它会产生以下错误,但会完成其他查询的插入过程

Msg 18054,16级,状态1,程序X,第14行
引发了错误50001,严重性为-1,状态为1,但在sys.messages中未找到具有该错误号的消息。如果错误大于50000,请确保使用sp_addmessage添加用户定义的消息

Msg 18054,16级,状态1,程序Y,第14行
引发了错误50001,严重性为-1,状态为1,但在sys.messages中未找到具有该错误号的消息。如果错误大于50000,请确保使用sp_addmessage添加用户定义的消息

Msg 18054,16级,状态1,程序Z,第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
我刚刚收到了上面的错误消息,而不是
,但是在sys.messages中没有找到带有该错误号的消息。如果错误大于50000,请确保使用sp_addmessage添加用户定义的消息。

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


再想想你想问什么,我想你的问题的答案是:

您需要将可能导致错误的每条语句放在它自己的TRY..CATCH块中,以便忽略该错误。在每个catch块中,您可以根据错误消息决定是否要抛出它并停止处理,或者什么也不做,只是可能将其存储在变量中,然后继续


然后在一切结束时,您可以检查您的变量,看看是否有您忽略的错误,并在当时抛出它们(如果您愿意的话),而无需回滚已成功运行的语句。

尝试捕获手动引发的错误似乎是多余的。如果不想引发错误,为什么要引发错误?RAISERROR可以引用存储在sys.messages目录视图中的用户定义消息,也可以动态生成消息。如果您查看存在错误的第一个代码块,我的理解是我试图定义现有错误并捕获它们。可能我错了,但需要处理第一个代码块中的错误。我不清楚您的实际问题是什么。是否要忽略生成的错误并继续执行语句?如果是这样,您必须在客户端捕获异常。这段代码决定了T-SQL批处理产生的第一个错误应该生成一个异常,从而阻止事情继续。您无法捕获T-SQL端的错误并恢复批处理,因为它没有这方面的功能。您需要为每个语句提供自己的
TRY。。捕捉
。请注意,
ANSI_WARNINGS
对此没有任何影响,
XACT_ABORT
有影响。好吧,也许下一次错误恢复时好的
可以起作用,但我不清楚Subash到底想做什么do@SubashBasnet当我查看第一个代码块时,我认为出现错误的唯一原因是您有3条RAISERROR语句。我不明白你为什么要忽略你提出的错误,而你一开始就不能提出它。我怀疑您提供的示例代码对于说明您在实际代码中实际要做的事情并没有真正的帮助。谢谢!仅围绕try-catch块中的整批查询就解决了这个问题。不需要单独试捕。例如:
开始尝试插入x()值();插入y()值();结束尝试开始捕捉结束捕捉