[英]MS SQL try catch ignored when executed by php mssql_query
我使用try catch塊在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
當我在管理工作室中執行它時,我得到以下結果:檢測到錯誤,這是我想要的。
但是當我使用mssql_query在PHP 5.3.2中執行它時,我得到以下結果:TRY塊中的錯誤后命令
為什么遇到SQL錯誤時沒有觸發我的catch塊?
我希望SQL停止進一步執行並轉到catch塊,就像在管理工作室中一樣。
非常感謝你的幫助!
編輯:添加了SET ANSI_NULLS ON
和QUOTED_IDENTIFIER
因為它們出現在我的測試程序中
編輯2:我嘗試將除法更改為0,因為有人指出我某些配置可能會忽略它們。 我用失敗的插入替換它,返回“字符串或二進制數據將被截斷。”。 同樣的問題仍然存在。
編輯3:重要信息:我最終使用PHP處理了一個不同的錯誤。 我用drop table #notExistingTable
生成一個錯誤,這次,它會進入catch塊,一切正常。 但是除以零或“字符串或二進制數據將被截斷”。 它不起作用。 似乎忽略了一些錯誤,有些錯誤會觸發catch塊。 在PHP中是否有特定的配置,我可以更改為與管理工作室相同並捕獲相同的錯誤嚴重性?
我意識到這個線程已經老了,但我已經驗證了這個錯誤。 違規參數是ARITHABORT
,PHP腳本需要在發送EXEC
查詢之前運行SET ARITHABORT ON query
查詢。 您可以使用SET ARITHABORT OFF
在管理工作室中復制
如果連接的ARITHABORT = OFF
,則程序將在DIV BY 0行終止,並且不會執行CATCH。
您可以在過程開始時嘗試SET XACT_ABORT ON
。 也許錯誤是由於嘗試在“exception”語句之后執行select語句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.