我使用try catch块在MS SQL 2005中使用简单的存储过程简化了我的问题。
就是这样:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE testError
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
BEGIN TRY
DECLARE @X INT
---- Divide by zero to generate Error
SET @X = 1/0
select 'Command after error in TRY block' AS retour
END TRY
BEGIN CATCH
select 'Error Detected' AS retour
return
END CATCH
select 'Command after TRY/CATCH blocks' AS retour
END
当我在管理工作室执行时,我得到以下结果:检测到错误,这就是我想要的。
但是当我在PHP 5.3.2中使用mssql_query执行它时,我得到以下结果:在TRY块中出错后命令
为什么遇到SQL错误时未触发我的catch块?
我希望SQL停止进一步执行并转到catch块,就像在管理工作室中一样。
非常感谢你的帮助!
编辑:添加了SET ANSI_NULLS ON
和QUOTED_IDENTIFIER
,因为它们出现在我的测试程序中
编辑2:我尝试将除法更改为0,因为有人指出我某些配置可能会忽略它们。我用失败的插入替换它,返回“字符串或二进制数据将被截断。”。同样的问题仍然存在。
编辑3:重要信息:我最终使用PHP处理了一个不同的错误。我用drop table #notExistingTable
生成一个错误,这次,它转到catch块,一切正常。但是除以零或“字符串或二进制数据将被截断”。它不起作用。似乎忽略了一些错误,有些错误会触发catch块。在PHP中是否有特定的配置,我可以更改为与管理工作室相同并捕获相同的错误严重性?
答案 0 :(得分:1)
我意识到这个帖子已经老了,但我已经验证了这个错误。违规参数为ARITHABORT
,PHP脚本需要在发送SET ARITHABORT ON query
查询之前运行EXEC
。您可以使用SET ARITHABORT OFF
如果连接为ARITHABORT = OFF
,则过程将在DIV BY 0行终止,并且不会执行CATCH。
答案 1 :(得分:0)
您可以在程序开始时尝试SET XACT_ABORT ON
。也许错误是由于尝试在"异常"之后执行select语句。言。