2016-05-18 123 views
0

我遇到了一些複雜的查詢,需要我在表中插入一些東西的麻煩,但如果我發現兩列是相同的,我應該用觸發器停止事務。我做了一些代碼來做到這一點,但即使它現在正常工作,我也不能確定它是否100%。我可以在SQL Server中的INSTEAD OF INSERT觸發器中插入INSERT嗎?

alter trigger TR1 
    on Passer instead of insert 
    as 
    begin 
    declare @A int 
    declare @B int 
    declare @C int 
    set @A = (select code_ligne from inserted) 
    set @B = (select ordre_passage from inserted) 
    set @C = (select code_ville from inserted) 
    select * from passer 
    where code_ligne = @A 
    and ordre_passage = @B 

    if(@@rowcount = 0) 
    begin 
    insert into Passer values(@A,@C,@B) 
    print 'okay' 
    print @@rowcount 
    end 
    end 
+2

觸發誤解101:插入只有一行。插入可以有多個行。 – mxix

+0

感謝您的評論先生,所以你的意思是我有一個問題,當我插入多行? –

+0

是的,您將遇到多行問題。爲什麼不在code_ligne和ordre_passage上設置唯一約束?如果有人試圖再次插入該複合密鑰,它將引發唯一的密鑰錯誤。 – mxix

回答

0

當您在觸發器中具有像這樣的標量變量時,您將遇到問題。如果一次插入兩行,則只能將一行插入到Passer中。你根本不需要這些變量。只需將其切換爲基於單個集合的插入語句即可。沿着這些線路的東西。

alter trigger TR1 on Passer instead of insert as 
begin 

    insert into Passer 
    (
     code_ligne 
     , ordre_passage 
     , code_ville 
    ) 
    select i.code_ligne 
     , i.ordre_passage 
     , i.code_ville 
    from inserted i 
    join Passer p on p.code_ligne = i.code_ligne 
       and p.ordre_passage = i.ordre_passage 

    if(@@rowcount = 0) begin 
     print 'okay' 
     print @@rowcount 
    end 
end 
+0

先生非常感謝你我是一個初學者和你的方式它是一個非常簡單和不錯的方式來做到這一點,我愛上了你的代碼先生 –

+0

@ adilzakarya - 如果這對你有用,那麼你應該考慮將其作爲答案。 –

+0

我做到了對不起,先生,我的錯誤,我是新來的 –

相關問題