2014-01-13 3 views
0

У меня есть хранимая процедура, когда она выполняется, она вставляет в две таблицы несколько записей.tsql mutiple inserts в транзакции с откатом

скажем, включить в таблицу авторов запись и вставить в таблицу книг несколько записей (авторских книг).

Как сделать все вставку в транзакцию с откатом?

Я прочитал некоторые статьи/блоги, @@ trancount/@@ error/XACT_STATE() меня смущает.

Какой лучший подход?

вот мой прок:

CREATE PROCEDURE [dbo].[proc_addAuthors] 
    @bookid1 int, @bookid2 int, @bookid3 int, @bookid4 int, @bookid5 int, 
    @authInfo 
AS 
    insert into author...(leave out params) 
    --get authorId 
    ... 

    --insert books (leave out validation checks...) 
    insert into author2book(authorId, bookId) values(@authorid, @bookid1) 
    ... 

RETURN 0 
+0

Какова ваша версия сервера sql? –

+0

@rudibruchez Это в тегах вопроса - 2008. – Bridge

+0

гул, вы правы ... –

ответ

0

Если вы просто хотите, чтобы убедиться, что вставки либо оба отделки успешно, или оба откат, если произошла ошибка, вам необходимо добавить следующие строки в хранимой процедуре:

CREATE PROCEDURE [dbo].[proc_addAuthors] 
    @bookid1 int, @bookid2 int, @bookid3 int, @bookid4 int, @bookid5 int, 
    @authInfo 
AS 

SET XACT_ABORT ON; -- Automatically rollback if an error occurs. 
BEGIN TRANSACTION; 

    insert into author...(leave out params) 
    --get authorId 
    ... 

    --insert books (leave out validation checks...) 
    insert into author2book(authorId, bookId) values(@authorid, @bookid1) 
    ... 

COMMIT TRANSACTION; 

RETURN 0 
0
CREATE PROCEDURE addTitle(@title_id VARCHAR(6), @au_id VARCHAR(11), 
          @title VARCHAR(20), @title_type CHAR(12)) 
AS 

BEGIN TRAN 
    INSERT titles(title_id, title, type) 
    VALUES (@title_id, @title, @title_type) 

    IF (@@ERROR <> 0) GOTO ERR_HANDLER 

    INSERT titleauthor(au_id, title_id) 
    VALUES (@au_id, @title_id) 

    IF (@@ERROR <> 0) GOTO ERR_HANDLER 

COMMIT TRAN 

RETURN 0 

ERR_HANDLER: 
PRINT 'Unexpected error occurred!' 
ROLLBACK TRAN 
RETURN 1 
0

Вот путь с современным TRY CATCH блок, чтобы проверить ошибку

CREATE PROCEDURE [dbo].[proc_addAuthors] 
    @bookid1 int, @bookid2 int, @bookid3 int, @bookid4 int, @bookid5 int, 
    @authInfo 
AS 
    BEGIN TRY 
     BEGIN TRANSACTION 
     insert into author...(leave out params) 
     --get authorId 
     ... 

     --insert books (leave out validation checks...) 
     insert into author2book(authorId, bookId) values(@authorid, @bookid1) 
     ... 
     COMMIT TRANSACTION 
    END TRY 
    BEGIN CATCH 
     SELECT ERROR_MESSAGE() as errorMessage -- for example 
     ROLLBACK 
     RETURN 1 -- for example 
    END CATCH 

    RETURN 0 
0

Использование блока Try..Catch дает вам доступ к функциям ошибок, которые вы можете использовать для получения подробной информации об ошибке.

CREATE PROCEDURE [dbo].[proc_addAuthors] 
@bookid1 int, @bookid2 int, @bookid3 int, @bookid4 int, @bookid5 int, 
@authInfo 
AS 
BEGIN 
SET NOCOUNT ON; 

    DECLARE @NewAuthorID INT; 


    BEGIN TRY 

    BEGIN TRANSACTION 
     insert into author...(leave out params) 
     --get authorId 
     SET @NewAuthorID = SCOPE_IDENTITY(); --<-- Get new AuthorID generated by Identity column 

     --insert books (leave out validation checks...) 
     insert into author2book(authorId, bookId)  --<-- use that NewAuthorID param here    
       values(@NewAuthorID, @bookid1) 
     ... 
    COMMIT TRANSACTION 
    RETURN 0 
    END TRY 

    BEGIN CATCH 
     IF (@@TRANCOUNT > 0) 
      ROLLBACK TRANSACTION 

     DECLARE @ErrorNum int 
     SELECT @ErrorNum = ERROR_NUMBER() 
     SELECT ERROR_MESSAGE() AS ErrorMessage, 
      ERROR_LINE() AS ErrorLine, 
      --<--.... (Other Error Functions) 

     RETURN @ErrorNum 
    END CATCH 
END 
+0

@Scott Извините, какое сообщение об ошибке у вас есть ??? n Да, я пропустил тип данных для переменной ErrorNum, но у вас есть основная идея, как это сделать. –

Смежные вопросы