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

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

当我在 management studio 中执行它时,我得到以下结果:检测到错误,这正是我想要的。

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

为什么遇到SQL错误时我的catch块没有被触发?

我希望 SQL 停止进一步执行并转到 catch 块,就像在管理工作室中一样。

非常感谢您的帮助!

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

编辑 2:我尝试通过另一个错误将除法更改为 0,因为有人指出我某些配置可能会忽略它们。我用 returns "String or binary data would be truncated." 失败的插入替换了它。还是出现同样的问题。

编辑 3:重要信息: 我终于让它与 PHP 一起工作,但出现了不同的错误。我用 drop table #notExistingTable 生成了一个错误,这一次,它进入了 catch 块,一切正常。但是除以零或 "String or binary data would be truncated." 它不起作用。似乎有些错误被忽略了,有些错误触发了 catch 块。 PHP 中是否有特定的配置,我可以将其更改为与 management studio 相同的行为并捕获相同的错误严重性?

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

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

在 Management Studio 中复制

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