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


MS SQL try catch ignored when executed by php mssql_query

我用一个简单的存储过程在MS SQL 2005中用try catch块简化了我的问题。

是这样的:

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

当我在管理工作室执行它时,我得到以下结果:Error Detected,这是我想要的。

但是当我在PHP 5.3.2中使用mssql_query执行它时,我得到以下结果:Command after error in TRY block

当遇到SQL错误时,为什么我的catch块不触发?

我希望SQL停止进一步执行并进入catch块,就像它在管理工作室中所做的那样。

谢谢你的帮助!

编辑:添加SET ANSI_NULLS ONQUOTED_IDENTIFIER,因为它们存在于我的测试过程

edit 2:我尝试通过另一个错误更改除0,因为有人指出我一些配置可能会忽略它们。我用一个失败的插入替换了它,它返回"字符串或二进制数据将被截断。"同样的问题仍然会发生。

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

我意识到这个线程是旧的,但我已经验证了这个错误。有问题的参数是ARITHABORT, PHP脚本需要在发送EXEC查询之前运行SET ARITHABORT ON query。您可以使用SET ARITHABORT OFF

在管理工作室中进行复制。

如果连接为ARITHABORT = OFF,则过程将在DIV BY 0行终止,并且不会执行CATCH。

您可以在程序开始时尝试SET XACT_ABORT ON。可能错误是由于尝试在"exception"语句之后执行select语句。