Каким будет поток выполнения для следующей процедуры? - PullRequest
0 голосов
/ 18 августа 2011

Ниже приведен код моей хранимой процедуры, но мне не совсем понятен ход выполнения.Как будет работать @@ RAISERROR () в моем случае и как это изменит нормальный поток?Также, что означают числа 10 и 1 в этой функции.Есть также несколько других чисел, которые можно использовать вместо 10 и 1, так как все числа влияют на ход выполнения.Пожалуйста, дайте мне знать, если моя структура кодирования стиля плохая / неправильная или есть какие-то возможности для улучшения.Ниже мой код.

CREATE PROCEDURE spAddressMaster 
@Mode           varchar(20),
@Street         varchar(MAX),
@City           varchar(300),
@State          varchar(300),
@Country        varchar(300),
@PostalCode     int,
@Remarks        varchar(MAX),
@Type           varchar(300)
AS
BEGIN
BEGIN TRANSACTION
BEGIN TRY
--INSERT MODE--
IF(@Mode='INSERT')
BEGIN
    INSERT INTO [AddressMST] (
                [Street],
                [City],
                [State],
                [Country],
                [PostalCode],
                [Remarks],
                [Type]
                )
    VALUES (
        @Street,
        @City,
        @State,
        @Country,
        @PostalCode,
        @Remarks,
        @Type
    ) 
IF(@@ERROR<>0)
    RAISERROR('Insert Operation Fail',10,1)
END
END TRY
BEGIN CATCH
    IF(@@ERROR<>0)
    BEGIN
        ROLLBACK TRANSACTION
        SELECT ERROR_MESSAGE()
    END 
END CATCH
END
GO

Ответы [ 2 ]

1 голос
/ 24 августа 2011

Во-первых, у вас большая проблема: у вас есть BEGIN TRANSACTION без COMMIT.Это почти так же неправильно, как вы можете получить при программировании для баз данных!Используйте эту общую структуру:

BEGIN TRANSACTION

BEGIN TRY

…do stuff…

COMMIT
END TRY

BEGIN CATCH

…error handling…

ROLLBACK

END CATCH

Далее, когда вы выполняете код в блоке BEGIN TRY, если возникают какие-либо ошибки, выполнение немедленно переносится в блок BEGIN CATCH,Это означает, что блок IF(@@ERROR<>0) будет выполняться только тогда, когда ошибок не было, т. Е. @@ ERROR всегда будет 0.

Что касается значения 10 и 1 в RAISERROR, это сложно, подробно и лучше всего объяснено в книгах по SQL Server онлайн под записью «RAISERROR».Вот ссылка .

0 голосов
/ 24 августа 2011

MSDN Doc

Generates an error message and initiates error processing for the session.
RAISERROR can either reference a user-defined message stored in the sys.messages catalog
view or build a message dynamically. The message is returned as a server error message
to the calling application or to an associated CATCH block of a TRY…CATCH construct. 

Подробнее см. ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...