2017-06-16 27 views
0

我有兩個相同的表,除了一個具有標識列而另一個沒有。相反,第二個表使用第一個表中的標識列的值。當我將一條記錄插入到第一個表中時,我想我會插入第二個表作爲觸發器。我似乎無法得到正確的語法。如何檢索插入觸發器中的標識列值SQL Server

從標識列@EDVisitId返回空值。

ALTER TRIGGER [dbo].[trgInserterrEDVisitOriginal] ON [dbo].[errEDVisit] 
AFTER INSERT 
AS 


--Name: Bob Avallone 
--Date: 6-15-2017 
-- 
-- The purpose of this trigger is to insert a record into errEDVisitOriginal 
-- whenever a new errEDVisit is inserted. 

--XXXXXXXXXX 



    declare @EDVisitId int 
    declare @SubmissionControlID INT 


Select @EDVisitId = EDVisitID from inserted 
SELECT @SubmissionControlID = SubmissionControlID from Inserted 


    Begin 

Insert Into errEDVisitOriginal (EDVisitId, SubmissionControlID) 

VALUES (@EDVisitId, @SubmissionControlID) 



End 
+1

你的觸發器有一個主要的缺陷!它假定只有一行插入。每次操作時,sql server中的觸發器都會觸發一次。因爲這種觸發器需要基於設置而不是基於標量的。 –

+0

而不是在觸發器中這樣做,你應該有一個插入程序。在那個過程中,你會想要使用OUTPUT子句,這樣你就可以捕獲所有新插入的標識值。 –

回答

0

你只需要SCOPE_IDENTITY()

選擇@EDVisitId = SCOPE_IDENTITY()

+0

這會獲得身份,但它會延續觸發器的缺陷本質。 –

+0

@SeanLange喲指的是什麼缺陷?你說的唯一的一個問題是你的文章中的問題是「從標識列@EDVisitId返回空值」。當您使用scope_identity()設置ID時,那麼問題是什麼? – AaronLS

+0

因爲在觸發器中使用像這樣的標量變量,假定只有一行被插入。這不是觸發器在sql server中的工作方式。觸發器需要基於設置。如果你堅持標量值的觸發器,你必須添加一個循環。啊!! –

0

您可以使用SCOPE_IDENTITY獲得最後插入的ID從第一個表放到一個變量,然後插入第二張桌子。

https://docs.microsoft.com/en-us/sql/t-sql/functions/scope-identity-transact-sql

+0

在插入多行時,在觸發器中使用像這樣的變量不是一個好方法。 –

+1

我沒有意識到他在觸發器上使用它。我會在存儲過程中執行插入而不是觸發器。 –

0

雖然有意複製信息的決定是值得懷疑,你有很大的過度思考的代碼。只是:

if exists (select * from inserted) 
insert dbo.errEDVisitOriginal (EDVisitId, SubmissionControlID) 
select EDVisitId, SubmissionControlID from inserted; 
1

感謝您的所有建議。我放棄了觸發器的想法。相反,我只需將第一張表中的新記錄插入第二張。見下文。

Insert errEDVisitOriginal(EdVisitId, SubmissionControlID) 
    Select EdVisitId, SubmissionControlID 
    from errEDVisit where SubmissionControlID = @SubmissionControlID