2016-12-23 6 views
0

メンバがNotesテーブルに存在しない場合は、前の挿入行をロールバックする必要があります。私はBeginトランザクションに両方の行を置くことによって、ロールバックすると考えましたが、エラーがスローされないため、insertコマンドが実行されます。 memberedが存在しない場合、どのようにエラーをスローして、コードブロック全体がロールバックされるのですか?beginトランザクションに含まれます。

begin try 
    begin transaction 
     insert into notes (memberid, NoteEffDate, LoginName, NoteDesc) values (367737, GETDATE(), 'marc', 'blah blah') 
     IF EXISTS (SELECT memberid FROM notes WHERE memberid =4774769) 
     begin 
     update notes set notedesc = 'hello there' where memberid = 4774769 
     end 
    commit transaction 
    end try 
    begin catch 
     rollback transaction 
     select ERROR_MESSAGE() 

     end catch 
     go 
+1

制御フローにエラーを使用することは実際には良い考えではありません。なぜあなたはまず存在のチェックをしないのですか? – ajeh

答えて

1

Sam Saffron's upsert methodのバージョンを使用しているようです。

手順は、そのためにどのように見えるかのラフ版:

create procedure dbo.notes_upsert (
    @memberid int 
    , @notesdesc varchar(256) 
    , @loginname varchar(256) 
) as 
begin 
    set nocount on; 
    set xact_abort on; 
    begin tran 
    update notes (with serializable) 
     set notedesc = @notedesc 
     where memberid = @memberid; 
    if @@rowcount = 0 
    begin; 
     insert into notes (memberid, NoteEffDate, LoginName, NoteDesc) 
     values (@memberid, getdate(), @loginname, @notesdesc); 
    end; 
    commit tran 
end; 
1

あなたができ、あなたのtryブロックで RAISEERROR。

begin try 
begin transaction 
    insert into notes (memberid, NoteEffDate, LoginName, NoteDesc) values (367737, GETDATE(), 'marc', 'blah blah') 
    IF EXISTS (SELECT memberid FROM notes WHERE memberid =4774769) 
    begin 
    update notes set notedesc = 'hello there' where memberid = 4774769 
    end 
    ELSE 

-- RAISERROR with severity 11-19 will cause execution to 
-- jump to the CATCH block. 
RAISERROR ('Error raised in TRY block.', -- Message text. 
      16, -- Severity. 
      1 -- State. 
      ); 
commit transaction 
end try 
begin catch 
    rollback transaction 
    select ERROR_MESSAGE() 

    end catch 
    go 
+0

お返事ありがとうございます。遅い返信のお詫びですが、これはスタックオーバーフローに関する私の最初の投稿でした。私は応答を受け取った場合、私は電子メール通知を期待していました。私は答えをチェックし、元に戻す。ありがとう – Marc

関連する問題