Verwenden von Ausgabe-Schlüsselwort, um zuletzt eingefügte datasätze in SQL-server zu erhalten?

Ich habe dieses Tool (SSMS Tools Pack), das CRUD sps für eine bestimmte Tabelle erzeugt

Aber ive Blick auf den "insert" code

/*1*/ CREATE PROC [dbo].[usp_EServices_ME_Country_InfoInsert] /*2*/ @MasterEntityID int, /*3*/ ... /*4*/ AS /*5*/ SET NOCOUNT ON /*6*/ SET XACT_ABORT ON /*7*/ /*8*/ BEGIN TRAN /*9*/ /*10*/ INSERT INTO [dbo].[EServices_ME_Country_Info] ([MasterEntityID],...) /*11*/ SELECT @MasterEntityID, ... /*12*/ /*13*/ -- Begin Return Select <- do not remove /*14*/ SELECT [ID], [MasterEntityID],... /*15*/ FROM [dbo].[EServices_ME_Country_Info] /*16*/ WHERE [ID] = SCOPE_IDENTITY() /*17*/ -- End Return Select <- do not remove /*18*/ /*19*/ COMMIT /*20*/ GO 

Meine Frage ist über Zeile # 14 – Könnten sie / ich das output Schlüsselwort verwenden? und wenn ja, würde die output alle eingefügten datasätze zurückgeben? (wenn es> 1 eingefügte datasätze in Zeile # 11 gibt)

Interessante Frage! Basierend auf der Info über die OUTPUT Klausel hier , würde ich denken, Sie könnten dies ändern:

 INSERT INTO [dbo].[EServices_ME_Country_Info] ([MasterEntityID],...) SELECT @MasterEntityID, ... -- Begin Return Select <- do not remove SELECT [ID], [MasterEntityID],... FROM [dbo].[EServices_ME_Country_Info] WHERE [ID] = SCOPE_IDENTITY() -- End Return Select <- do not remove 

dazu:

 INSERT INTO [dbo].[EServices_ME_Country_Info] ([MasterEntityID],...) OUTPUT INSERTED.MasterEntityID, ... SELECT @MasterEntityID, ... 

mit dem gleichen Ergebnis. Dies ist nur die Theorie für jetzt, ich werde es testing und folgen.

Nachverfolgen:

Meine OUTPUT Klausel war nicht korrekt, du musst OUTPUT direkt nach der INSERT Klausel verwenden. Bearbeitet das in der Abfrage oben. Ich habe den folgenden Code verwendet, um dies zu testing:

 -- Create a test table CREATE TABLE TestTable ( ID INT IDENTITY ,TestV1 INT ,TestV2 INT ,TestV3 INT ); GO -- Example sp with the 'old' method using SCOPE_IDENTITY() CREATE PROCEDURE usp_InsertFirstMethod ( @v1 INT ,@v2 INT ,@v3 INT ) AS SET NOCOUNT ON SET XACT_ABORT ON BEGIN TRAN INSERT INTO dbo.TestTable (TestV1, TestV2, TestV3) SELECT @v1, @v2, @v3; -- Begin Return Select <- do not remove SELECT ID, TestV1, TestV2, TestV3 FROM dbo.TestTable WHERE ID = SCOPE_IDENTITY() -- End Return Select <- do not remove COMMIT TRAN; GO -- Example sp to show use of OUTPUT clause CREATE PROCEDURE usp_InsertSecondMethod ( @v1 INT ,@v2 INT ,@v3 INT ) AS SET NOCOUNT ON SET XACT_ABORT ON BEGIN TRAN INSERT INTO dbo.TestTable (TestV1, TestV2, TestV3) OUTPUT INSERTED.* SELECT @v1, @v2, @v3; COMMIT TRAN; GO 

Beide EXECUTE dbo.usp_InsertFirstMethod 1, 2, 3; und EXECUTE dbo.usp_InsertSecondMethod 1, 2, 3; zeigen die gleichen Ergebnisse an. Scheint zu arbeiten!

Hier ist ein Beispiel für die Verwendung der OUTPUT Klausel DECLARE @@ table_variable-Tabelle (MasterEntityID, …)

 INSERT INTO [dbo].[EServices_ME_Country_Info] ([MasterEntityID],...) OUTPUT inserted.MasterEntityID,... INTO @table_variable SELECT @MasterEntityID, ... 

Und ja, du kannst auch alle Werte erhalten, die standardmäßig oder als IDENTITY eingefügt werden.