当php mssql_query执行时,MS SQL try catch被忽略

时间:2015-10-05 20:27:23

标签: php sql-server database sql-server-2005 try-catch

我使用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 ONQUOTED_IDENTIFIER,因为它们出现在我的测试程序中

编辑2:我尝试将除法更改为0,因为有人指出我某些配置可能会忽略它们。我用失败的插入替换它,返回“字符串或二进制数据将被截断。”。同样的问题仍然存在。

编辑3:重要信息:我最终使用PHP处理了一个不同的错误。我用drop table #notExistingTable生成一个错误,这次,它转到catch块,一切正常。但是除以零或“字符串或二进制数据将被截断”。它不起作用。似乎忽略了一些错误,有些错误会触发catch块。在PHP中是否有特定的配置,我可以更改为与管理工作室相同并捕获相同的错误严重性?

2 个答案:

答案 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语句。言。