【发布时间】:2024-01-20 13:03:01
【问题描述】:
我在 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
当我在管理工作室中执行它时,我得到以下结果:检测到错误,这是我想要的。
但是当我在 PHP 5.3.2 中使用 mssql_query 执行它时,我得到以下结果:TRY 块中错误后的命令
为什么遇到 SQL 错误时没有触发我的 catch 块?
我希望 SQL 停止进一步执行并转到 catch 块,就像在管理工作室中所做的那样。
非常感谢您的帮助!
编辑:添加了SET ANSI_NULLS ON 和QUOTED_IDENTIFIER,因为它们存在于我的测试过程中
edit 2:我尝试通过另一个错误将除法更改为 0,因为有人指出我某些配置可能会忽略它们。我用一个失败的插入替换它,它返回“字符串或二进制数据将被截断。”。同样的问题仍然存在。
编辑 3:重要信息:我终于使它与 PHP 一起工作,但出现了不同的错误。我用drop table #notExistingTable 生成了一个错误,这一次,它进入了catch 块,一切正常。但是除以零或“字符串或二进制数据将被截断”。它不起作用。似乎有些错误被忽略了,有些则触发了 catch 块。是否有 PHP 中的特定配置可以更改为与管理工作室相同并捕获相同的错误严重性?
【问题讨论】:
-
你真的在测试这个程序吗?还是有其他类似的程序?你的 catch 块中的
RETURN关键字将确保一旦你进入 catch 块,在关键字RETURN被执行后什么都没有。很难相信你在说什么。 -
如果你真的在使用 2008 并调用
SET ARITHIGNORE ON这可能会发生。 -
我尝试设置 ARITHABORT 关闭和 SET ARITHIGNORE 关闭只是为了确保它们没有干扰。我仍然有同样的问题。错误处理在 Management Studio 中可以正常工作,但在 php 调用时却不行。
-
M.Ali 是的,我只是在测试这个程序。我的真实过程中有很多其他的存储过程调用,我想以他最简单的形式测试这个问题。我还尝试从命令行调用测试过程,并且当 mssql_query 出现问题时,try catch 效果很好。我也尝试在我拥有的 Laravel 服务器上运行它,同样的问题发生了。
-
你解决了吗?因为我也有同样的问题。
标签: php sql-server database sql-server-2005 try-catch