2011-10-20 71 views
1

我已經嘗試過,但目前爲止尚未成功。由於我在查詢方面的知識有限,我認爲我會在這裏更好地發佈它。找到原始記錄並只更改不是插入的記錄

我有個同學的表結構如下

create table students(
id int not null primary key identity, 
sname varchar(25), 
status varchar(25), 
renew varchar(15), 
enrollment datetime, 
) 

我有很多學生誰擁有一個ID,studentName(SNAME),狀態(「激活」或「未激活狀態」),更新( '不'爲新生,是'爲新生')和入學日期。

insert into students values('jay','active','no','2010-01-01') 
insert into students values('Phil','active','no','2010-01-01') 
insert into students values('Cru','active','no','2010-01-01') 
insert into students values('slow','active','no','2010-01-01') 
insert into students values('true','active','no','2010-01-01') 
insert into students values('false','active','no','2010-01-01') 

現在我有一個INSERT觸發器,假設當一個學生被更新時,將一個老學生停用。因此,如果我插入以下設置爲「是」的續訂,它應該使已有的記錄「非活動」。

insert into students values('false','active','yes','2011-01-01') 

我寫了這個INSERT觸發器,它的工作原理,但它沒有激活舊的和新插入的記錄。我只想讓原始記錄失效。也不是說只有註冊日期和新域是不同的,其餘的原始和插入記錄是相同的。如何解決這個問題?這是我的觸發器

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
GO 
CREATE TRIGGER [dbo].[tr_renew_student] 
ON [dbo].students 
-- WITH ENCRYPTION 
FOR INSERT 
-- WITH APPEND 
-- NOT FOR REPLICATION 
AS 
-- insert sql here 
if exists(select * from inserted where Renew = 'yes') 
BEGIN 

UPDATE students 
    SET status = 'Inactive' 

    FROM Inserted i 
     INNER JOIN students T2 
      ON i.sname = T2.sname 

END 

請注意,這是近似於我的問題。謝謝 enter image description here

回答

0

你看過@@身份嗎?多年前,我處理了類似的事情,並使用@@身份來獲取最後創建的身份值;基本上獲得最新的身份值,然後設置符合條件的所有記錄,除了通過@@ identity返回的ID。

閱讀這裏的標識值干將: http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

新增:你說得對的inserted表。如果你不想/不能使用插入的表格,你的觸發器可能看起來像這樣。

SELECT @@identity // <- this gets the last identity value inserted. 

UPDATE students 
SET status = 'Inactive' 
WHERE students.name = (SELECT name FROM students WHERE id = @@identity) 
    AND id <> @@identity 

注:從內存中寫入,未經測試。

+0

我認爲最後插入的記錄沒有提供解決方案。「插入」表具有我需要與原始表連接的所有內容,並查找需要修改的實際記錄。 –

+0

我通常不會使用觸發器,因此Inserted會在早些時候放棄我的想法。查看我更新的答案,以獲取更多關於我想要的方法的詳細信息。 – OCary

1

您的更新改成這樣:

UPDATE students 
    SET status = 'Inactive' 

    FROM Inserted i 
     INNER JOIN students T2 
      ON i.sname = T2.sname 
      AND i.id <> t2.id 

這會檢查你正在更新的行不是新插入的行。

+0

問題:它將如何確保它會更新原始記錄,而不是插入一個?它按照 –

+0

@Thecrocodilehunter的方式完成了訣竅 - 因爲你要確保插入時自動生成的'Id'與新行的'id'不匹配。 – JNK

+0

這在我的測試示例中可以正常工作,但在我的實際代碼中,它可以用其他方式工作。該行在INSERTED表中更新,而不是需要更新的行。 –