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

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

我使用带有 try catch block 的 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

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

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

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

我希望 SQL 停止进一步执行并转到 catch block ,就像在 Management Studio 中一样。

非常感谢您的帮助!

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

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

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

最佳答案

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

在 management studio 中进行复制

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

关于php - MS SQL try catch 在被 php mssql_query 执行时被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32957326/

相关文章:

database - 如何设计数据库中的相似实体

php - PHP在单次请求中分配的内存是不是总是在最后释放?

php - 解析 WordPress Sql 查询中的结果

php - 为 apache 日志静音 PHP mysql_* deprecated 错误

python - 尝试使用 to_sql 函数插入时,数据库引擎无法连接到 sql-server 实例

mysql - 不确定如何设计有条件的一对多关系

php - 检查目录是否存在,创建目录

sql - tsql 字符串与 select 和 order by 的连接不能与 order by 子句中的函数一起使用?

sql-server - 从命令行启动和停止 SQL Server 的最佳方法是什么?

mysql - 如何使用mysql join on or condition?