#sql #sql-server #stored-procedures
#sql #sql-сервер #хранимые процедуры
Вопрос:
SQL Server 2014 (v12.0.5546) — У меня есть «главная» хранимая процедура, из которой я запускаю кучу других. Если кто-то выдает ошибку, я хочу, чтобы он напечатал строку с указанием этого.
Я запустил его сегодня, и одна из хранимых процедур в главной хранимой процедуре вернула сообщение об ошибке, в котором говорилось, что в таблице insert, которую я пытался вставить, было неправильное количество переменных, но ошибка не выводилась.
Я думал, что хранимые процедуры возвращают 0 в случае успеха, поэтому все, кроме этого, будет означать ошибку. Я ошибаюсь, или в моем процессе есть ошибка?
К вашему сведению, мне не нужно, чтобы он останавливался, если он обнаруживает ошибку, мне просто нужно, чтобы он выдавал сообщение об ошибке, чтобы я знал, где произошел сбой. К тому времени, когда все будет сказано и сделано, количество хранимых процедур вырастет до 20-30.
Вот основная хранимая процедура:
ALTER PROCEDURE [dbo].[Master_CreateLoadTables]
AS
DECLARE @retval INT
-- Builds all tables required for the stored procedures
EXEC @retval = [BuildTables]
IF (@retval) = 0
BEGIN
SET @retval = 1
EXEC @retval = [Load_CustomerLookup]
IF (@retval) <> 0
PRINT 'Load of Customer Lookup Table Failed'
EXEC @retval = [Load_CustomerInvoices]
IF (@retval) <> 0
PRINT 'Load of Customer Invoice Tables Failed'
EXEC @retval = [Load_Payments]
IF (@retval) <> 0
PRINT 'Load of Payments Table Failed'
END
ELSE
PRINT 'Table Creation Failed'
Ответ №1:
Я думал, что хранимые процедуры возвращают 0 в случае успеха, поэтому все, кроме этого, будет означать ошибку. Я ошибаюсь, или в моем процессе есть ошибка?
Хранимые процедуры возвращают любое значение, которое вы им указываете. Если нет оператора return, то они возвращают success , 0
.
Общепринятая практика — возвращать 0 для успеха и код ошибки для сбоя. Но это не применяется.
Вы имеете в виду пользовательские хранимые процедуры. Вам нужно исследовать, как они работают в вашей среде.
Я также рекомендую вам поместить тело хранимой процедуры в begin
/ end
block .
Комментарии:
1. «Если нет оператора return, то они возвращают NULL». Это неверно. SP никогда не может вернуться
NULL
; если вы попытаетесь выполнить aNULL
, возникнет ошибка, а затем будет возвращено 0: learn.microsoft.com/en-us/sql/t-sql/language-elements /. … Что касается инструкции OP, system SPS вернет 0 для успеха, возможно, именно здесь у них создается впечатление.2. DB<>Скрипка
3. @Larnu . . . Интересно, изменилось ли это со времен какой-то архаичной версии SQL Server. Я почти уверен, что потратил время на отладку проблем, вызванных
NULL
возвращаемыми значениями в sps. Ну что ж. Спасибо за информацию. Я обновил ответ.
Ответ №2:
одна из хранимых процедур в главной хранимой процедуре вернула сообщение об ошибке, в котором говорилось, что в таблице insert, которую я пытался вставить, было неправильное количество переменных, но ошибка не выводилась.
Похоже, это была ошибка компиляции. Код возврата не будет установлен после ошибок компиляции, поэтому назначенная переменная останется неизменной. Например:
CREATE PROC dbo.ExampleCompilationError
AS
SELECT * FROM dbo.ThisTableDoesNotExist;
GO
DECLARE @rc int = NULL;
EXEC @rc = dbo.ExampleCompilationError;
SELECT @rc;
GO
Код возврата все еще NULL
с этим кодом.
Вы могли бы окружить каждое выполнение процедуры TRY / CATCH, которое будет улавливать ошибки компиляции и ошибки времени выполнения во внутренней области:
BEGIN TRY
EXEC dbo.ExampleCompilationError;
END TRY
BEGIN CATCH
PRINT 'ExampleCompolationError failed';
END CATCH;