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 ON
和 QUOTED_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。
我使用 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 ON
和 QUOTED_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
如果连接 ARITHABORT = OFF
,过程将在 DIV BY 0 行终止,并且不会执行 CATCH。