Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Научите писать хп без логических ошибок  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
MS SQL 2005

Есть написаная ХП, работает без ошибок. Какие есть в ней ошибки или лишние действия (t-sql) ?
ALTER PROC [dbo].[tm_fg_method]
    @obj_id int,
    @method_id  smallint,
    @obj_type_id    smallint = NULL
AS
SET NOCOUNT ON
BEGIN
    DECLARE
        @err_msg varchar(255),
        @rc int

    BEGIN TRAN tm_fg_method
    SAVE TRAN tm_fg_method

    EXEC @rc = dbo.tm_begin_method
       @obj_id= @obj_id,
       @method_id= @method_id,
       @obj_type_id = @obj_type_id

    IF @@ERROR <> 0 OR @rc <> 0
    BEGIN
        SELECT @err_msg = 'Ошибка при начале метода '
            +(SELECT method_name FROM dbo.tms_methods WHERE method_id = @method_id)
            +'('+CONVERT(varchar(10),@method_id)+')'
        GOTO EXIT_ROLLBACK
    END

    EXEC @rc = dbo.tm_end_method
       @obj_id= @obj_id,
       @method_id= @method_id,
       @obj_type_id = @obj_type_id

    IF @@ERROR <> 0 OR @rc <> 0
    BEGIN
        SELECT @err_msg = 'Ошибка при завершении метода '
            +(SELECT method_name FROM dbo.tms_methods WHERE method_id = @method_id)
            +'('+CONVERT(varchar(10),@method_id)+')'
        GOTO EXIT_ROLLBACK
    END

    COMMIT TRAN
    RETURN 0
EXIT_ROLLBACK:
    ROLLBACK TRAN tm_fg_method
    COMMIT TRAN

EXIT_ERROR:
    SELECT @err_msg = 'tm_fg_method: '+@err_msg
    EXEC sp_raiserror @err_msg
    RETURN 1
END

Мне не нравится эти две строки
    BEGIN TRAN tm_fg_method
    SAVE TRAN tm_fg_method
Думаю, что вторая строка не нужна. Верно ли я думаю?
К чему ещё можно придраться, в стиле написания?
13 авг 12, 15:01    [13004330]     Ответить | Цитировать Сообщить модератору
 Re: Научите писать хп без логических ошибок  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37143
Ну и не трогайте, раз работает без ошибок.
13 авг 12, 15:01    [13004340]     Ответить | Цитировать Сообщить модератору
 Re: Научите писать хп без логических ошибок  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Гавриленко Сергей Алексеевич,

Мне разобраться нужно, чтобы самому писать так или лучше :)
Вот и спрашиваю, что не идеально в ХП?
13 авг 12, 15:03    [13004359]     Ответить | Цитировать Сообщить модератору
 Re: Научите писать хп без логических ошибок  [new]
Glory
Member

Откуда:
Сообщений: 104760
trew
Вот и спрашиваю, что не идеально в ХП?

Перед ROLLBACK TRAN и COMMIT TRAN нет проверки на наличие транзакции

В
EXIT_ROLLBACK:
    ROLLBACK TRAN tm_fg_method
    COMMIT TRAN

почему COMMIT TRAN стоит ? Чтобы зафиксировать внешную транзакцию ? А если ее инициатор против этого ?
13 авг 12, 15:15    [13004488]     Ответить | Цитировать Сообщить модератору
 Re: Научите писать хп без логических ошибок  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Glory,

COMMIT TRAN уберу, это верхняя хп, ни куда не вложена.

Почему в примере ниже, всегда возвращается 7 ( со строкой SAVE TRAN и без неё)

DECLARE @a int
SET @a =3
BEGIN TRAN AAA
SET @a =5

--SAVE TRAN AAA
SET @a =7

ROLLBACK TRAN AAA

SELECT @a

И ещё один вопрос ROLLBACK TRAN до какого состояния откатывает? (SAVE TRAN или BEGIN TRAN)
В хелпе, в разделе ROLLBACK TRANSACTION ни чего не нашел про SAVE TRAN.
13 авг 12, 15:35    [13004625]     Ответить | Цитировать Сообщить модератору
 Re: Научите писать хп без логических ошибок  [new]
hpv
Member

Откуда:
Сообщений: 153
trew,

trew
И ещё один вопрос ROLLBACK TRAN до какого состояния откатывает? (SAVE TRAN или BEGIN TRAN)


В SAVE TRANSACTION описано

SAVE TRAN
13 авг 12, 15:54    [13004752]     Ответить | Цитировать Сообщить модератору
 Re: Научите писать хп без логических ошибок  [new]
Glory
Member

Откуда:
Сообщений: 104760
trew
Почему в примере ниже, всегда возвращается 7

Потому что локальные переменные никакого отношения к транзакциям не имеют.
13 авг 12, 15:58    [13004780]     Ответить | Цитировать Сообщить модератору
 Re: Научите писать хп без логических ошибок  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
EXEC @rc = dbo.tm_begin_method
       @obj_id= @obj_id,
       @method_id= @method_id,
       @obj_type_id = @obj_type_id

    IF @@ERROR <> 0 OR @rc <> 0
    BEGIN
        SELECT @err_msg = 'Ошибка при начале метода '
            +(SELECT method_name FROM dbo.tms_methods WHERE method_id = @method_id)
            +'('+CONVERT(varchar(10),@method_id)+')'
        GOTO EXIT_ROLLBACK
    END
В данном фрагменте, анализ значения @@ERROR не имеет смысла.
13 авг 12, 16:12    [13004861]     Ответить | Цитировать Сообщить модератору
 Re: Научите писать хп без логических ошибок  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
invm,

А где нужно проверять, перед COMMIT TRAN (всегда в конце процедуры) ?
13 авг 12, 16:50    [13005146]     Ответить | Цитировать Сообщить модератору
 Re: Научите писать хп без логических ошибок  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
trew,
BOL
Возвращает 0, если в предыдущей инструкции Transact-SQL не возникли ошибки.

Возвращает номер ошибки, если в предыдущей инструкции возникла ошибка. Если ошибка относится к представлению каталога sys.messages, @@ERROR содержит значение столбца sys.messages.message_id для этой ошибки. Можно просмотреть текст, связанный с номером ошибки @@ERROR в sys.messages.

Поскольку функция @@ERROR очищается и сбрасывается для каждой выполняемой инструкции, проверяйте ее сразу после инструкции или сохраните значение в локальную переменную для последующей проверки.

Для обработки ошибок используйте конструкцию TRY...CATCH. Конструкция TRY...CATCH также поддерживает дополнительные системные функции (ERROR_LINE, ERROR_MESSAGE, ERROR_PROCEDURE, ERROR_SEVERITY и ERROR_STATE), возвращающие более подробные сведения, чем @@ERROR. Кроме того, TRY...CATCH поддерживает функцию ERROR_NUMBER, которая не ограничена тем, что возвращает номер ошибки немедленно после выполнения инструкции. Дополнительные сведения см. в разделе TRY...CATCH (Transact-SQL).
13 авг 12, 16:59    [13005212]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить