Я упростил мою проблему с помощью простой хранимой процедуры в 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
Почему мой блок catch не срабатывает при обнаружении ошибки SQL?
Я хочу, чтобы SQL остановил дальнейшее выполнение и перешел к блоку catch, как это происходит в Management Studio.
Большое спасибо за вашу помощь!
редактировать: добавлено SET ANSI_NULLS ON
а также QUOTED_IDENTIFIER
потому что они присутствуют в моей процедуре испытаний
редактировать 2: я пытался изменить деление на 0 из-за другой ошибки, так как кто-то указал мне, что некоторые конфигурации могут их игнорировать. Я заменил его неудачной вставкой, которая возвращает «Строка или двоичные данные будут обрезаны». Та же проблема все еще возникает.
редактировать 3: Важная информация: Я наконец заставил это работать с PHP с другой ошибкой. Я генерирую ошибку с drop table #notExistingTable
и на этот раз он идет в блок catch и все работает нормально. Но с делением на ноль или с «Строка или двоичные данные будут усечены». это не работает Похоже, некоторые ошибки игнорируются, а некоторые запускают блок catch. Есть ли в PHP конкретный конфиг, который я могу изменить так, чтобы он действовал так же, как и студия управления, и уловил ту же серьезность ошибок?
Я понимаю, что эта тема старая, но я подтвердил эту ошибку. Нарушающий параметр ARITHABORT
скрипт PHP должен запустить SET ARITHABORT ON query
перед отправкой EXEC
запрос. Вы можете воспроизвести в студии управления с помощью SET ARITHABORT OFF
Если ARITHABORT = OFF
для соединения процедура завершится в строке DIV BY 0, и CATCH не будет выполнен.
Ты можешь попробовать SET XACT_ABORT ON
в начале процедуры. Возможно, ошибка связана с попыткой выполнить оператор выбора после оператора «исключение».