2016-04-26 5 views
0

Ich habe TableA und TableB in SQL Server 2008Holen Sie die Identität eines Einsatzes in einem Trigger

TableA haben einen Trigger, der ausgelöst wird, nachdem INSERT & UPDATE auf den Auslöser Im in TableB Einfügen so meine Frage ist, wie Kann ich die eingefügte ID von TableB bekommen? FROM INSERTED haben die Informationen des Datensatzes in TableA?

ALTER TRIGGER [dbo].[trg_up_move] ON [dbo].[TableA] AFTER INSERT, UPDATE 
AS 
BEGIN 
DECLARE @idMovINS INT 
DECLARE @stationINS char(8) 
DECLARE @idWorkerINS INT 
DECLARE @statusINS TINYINT 
SELECT @idMovINS=id_mov FROM INSERTED 
SELECT @stationINS=station_number FROM INSERTED 
SELECT @idWorkerINS=id_worker FROM INSERTED 
SELECT @statusINS=status_mov FROM INSERTED 
-- CODE 

-- MORE CODE 

-- MUCH MORE CODE 

    IF @SOMEVAL='WISE DECISION' 
    BEGIN 
    DECLARE @idTableB INT 
    INSERT INTO TableB (FieldA,FieldB,FieldC)VALUES(@idWorkerINS,@stationINS,'More info') 
    --SET @[email protected]@IDENTITY 
    --SET @idTableB=SCOPE_IDENTITY() 

    --MAKE SOME OTHER THINGS WITH @idTableB 
    END 
END 

Wenn ich ein hundert oder tausend Einfügungen zu TabelleA in derselben Sitzung senden. Kann ich @@ identity oder scope_identity() (ich gehe für die letzte) verwenden, um die Identität der b-Einfügung zu erhalten? Und wie bequem und sicher ist es, eine dieser beiden Funktionen zu verwenden, die jedes Mal, wenn der Auslöser ausgelöst wird, und die Zeit zum Abschließen der gesamten Triggerfunktion berücksichtigen.

+0

Mögliches Duplikat [Was ist der Unterschied zwischen Scope \ _Identity(), Identität() @@ Identität, und Ident \ _Current?] (Http://stackoverflow.com/questions/1920558/what- is-the-difference-zwischen-scope-identity-identity-identity-and-ide) – Yuck

+0

Mögliches Duplikat von [Wie verwende ich die OUTPUT-Klausel einer INSERT-Anweisung, um den Identity-Wert zu erhalten?] (http://stackoverflow.com/ Fragen/10999396/how-do-ich-benutze-ein-insert-statements-output-clause-um-den-Identity-Wert zu erhalten) – GSerg

Antwort

1

Trigger werden auf Basis gesetzt. Daher ist der Gedanke, eine einzige Identität zu bekommen, fehlgeleitet.

Aka, wenn Sie 10 Zeilen einfügen, wird die "eingefügte" Tabelle 10 Zeilen haben.

Das folgende Beispiel zeigt die Verwendung von "output". Ich glaube, es würde Ihren Bedürfnissen besser entsprechen.

create table PrimaryHolderTable (i int identity (1001,2) not null primary key, j int not null unique) 
create table #OutputResultsHolder (i int not null, j int not null) 

insert into PrimaryHolderTable (j) 
output inserted.i, inserted.j into #OutputResultsHolder 
select top 10 o.object_id from sys.objects as o order by o.object_id desc /*<< from sys.objects is there just to provide some rows */ 


select * from #OutputResultsHolder 
drop table #OutputResultsHolder, PrimaryHolderTable; 

go 



create table dbo.EmployeeTable (EmpKey int identity(1001,2) , EmpAge int not null); 
create table dbo.AuditTable (EntityKey int not null default -1 , OldValue int null, NewValue int null , Tag varchar(64) ); 

insert into dbo.EmployeeTable (EmpAge) 
output inserted.EmpKey , null , inserted.EmpAge , 'Employee Inserted' into dbo.AuditTable (EntityKey , OldValue , NewValue , Tag) 
values(18); 

insert into dbo.EmployeeTable (EmpAge) 
output inserted.EmpKey , null , inserted.EmpAge , 'Employee Inserted' into dbo.AuditTable (EntityKey , OldValue , NewValue , Tag) 
values(20); 

insert into dbo.EmployeeTable (EmpAge) 
output inserted.EmpKey , null , inserted.EmpAge , 'Employee Inserted' into dbo.AuditTable (EntityKey , OldValue , NewValue , Tag) 
values(22); 


update dbo.EmployeeTable 
    set EmpAge = EmpAge + 1 
output inserted.EmpKey , deleted.EmpAge, inserted.EmpAge , 'Employee Updated' into dbo.AuditTable (EntityKey , OldValue , NewValue , Tag) 
where EmpAge <=20; 

delete from dbo.EmployeeTable 
output deleted.EmpKey , deleted.EmpAge, NULL , 'Employee Deleted' into dbo.AuditTable (EntityKey , OldValue , NewValue , Tag) 
where EmpAge > 0; /*Test multi rows*/ 

select * from dbo.EmployeeTable; /* <<will be empty at this point */ 
select * from dbo.AuditTable; 

drop table dbo.EmployeeTable, dbo.AuditTable; 
go 
+0

Ich hatte einmal einen Anbieter, der diese Funktion der Trigger nicht verstanden hat. Sie hatten einen Trigger auf einem Tisch mit einer Unterabfrage. Wenn Sie eine DML für eine Menge von mehr als 1 erstellt haben, wird der Fehler "Unterabfrage gibt mehr als eine Zeile zurück" ausgelöst. –

+0

Ich weiß gut, wie die Auslöser funktioniert, ich sage nicht, dass ich eine einzige Identität haben werde, die über den Prozess sagt, der feuert, wenn man seinen Einschub aufzeichnet. Vielleicht werde ich für die Bearbeitung der Frage gehen. –

Verwandte Themen