2012-06-21 52 views
0

我想在更新時檢查列值,如果它的匹配插入到另一個表中。 我的表:FirstTable觸發條件的特定列

SecondTable

我的觸發器:

CREATE TRIGGER tr_test 
ON test1 
FOR UPDATE 
AS 
    SET nocount ON 

    IF (Update(sname)) 
     DECLARE @Name NVARCHAR 

    DECLARE @id INT 

    SET @[email protected]@IDENTITY 
    SET @Name=(SELECT sname 
       FROM test1 
       WHERE id = @id) 

    IF(@Name = 'Paras') 
     BEGIN 
      INSERT INTO test2 
         (loginfo) 
      VALUES  ('success') 
     END 

而且我的更新查詢:

update Test1 set Sname='Paras' where ID=1 

當我運行此更新查詢什麼也不發生。 Test2表是空的。我想問題是@@IDENTITY但不確定。謝謝。

+1

@@ IDENTITY:是一個系統函數ret甕最後插入的身份值.http://msdn.microsoft.com/en-us/library/ms187342.aspx –

+0

哦,它的一個錯誤。所以我如何找到更新的列'ID'? –

+0

另請注意,SQL Server中的觸發器在每個語句**中調用**(不是每行一次)。可以調用一次插入50行的「INSERT」語句。你需要處理這個事實 - 不要認爲你的觸發器只處理一行! –

回答

1

試試這個:

CREATE TRIGGER tr_test 
ON test1 
FOR UPDATE 
AS 
    SET nocount ON 

    IF (Update(sname)) 
     DECLARE @Name NVARCHAR 

    DECLARE @id INT 

    SET @id=(select id from inserted) 
    SET @Name=(SELECT sname 
       FROM inserted 
       WHERE id = @id) 

    IF(@Name = 'Paras') 
     BEGIN 
      INSERT INTO test2 
         (loginfo) 
      VALUES  ('success') 
     END 

但它是更好地做到這一點,更新可以更新很多行,上面會失敗,如果UPDATE許多行匹配,使用EXISTS:

CREATE TRIGGER tr_test 
ON test1 
FOR UPDATE 
AS 
    SET nocount ON 

    IF(EXISTS(select * From inserted where sname = 'Paras')) 
     BEGIN 
      INSERT INTO test2 
         (loginfo) 
      VALUES  ('success') 
     END 

inserted表是UPDATE的新值所在的表的名稱,deleted表是UPDATE的舊值的表的名稱

+0

哪個ID是select.I想要選擇更新的列ID,但我怎麼不知道?任何想法? –

+0

你可以從插入的表中獲得'ID'。但是您不需要根據您獲得的'ID'重新查詢'test1'表,UPDATE語句的所有更新舊值都已分別位於'inserted'和'deleted'表中 –

+0

Thanks.I我測試了它。但問題是一樣的'Test2'表仍然是空的。沒有數據被插入'Test2'。 –