In SQL Server è possibile ottenere l'"id" di un record quando viene eseguito l'inserimento?

StackOverflow https://stackoverflow.com/questions/55159

  •  09-06-2019
  •  | 
  •  

Domanda

In SQL Server 2005 ho un campo "id" in una tabella con la proprietà "Is Identity" impostata su "Sì".Pertanto, quando viene eseguito un inserimento su quella tabella, l'"id" viene impostato automaticamente sul successivo numero intero incrementale.Esiste un modo semplice quando viene eseguito l'Insert per ottenere ciò su cui è stato impostato l'"id" senza dover eseguire un'istruzione Select subito dopo l'Insert?

duplicato di:
Il modo migliore per ottenere l'identità della riga inserita?

È stato utile?

Soluzione

Almeno in .Net, puoi inviare più query al server in una volta sola.Lo faccio nella mia app:

command.CommandText = "INSERT INTO [Employee] (Name) VALUES (@Name); SELECT SCOPE_IDENTITY()";
int id = (int)command.ExecuteScalar();

Funziona come un fascino.

Altri suggerimenti

Se stai inserendo più righe, l'uso di OUTPUT E INSERTED.columnname clausola sul insert L'istruzione è un modo semplice per inserire tutti gli ID in una tabella temporanea.

DECLARE @MyTableVar table( ID int,  
                               Name varchar(50),  
                               ModifiedDate datetime);  
INSERT MyTable  
        OUTPUT INSERTED.ID, INSERTED.Name, INSERTED.ModifiedDate INTO @MyTableVar  
SELECT someName, GetDate() from SomeTable  

Scope_identity() è il modo preferito, vedere: 6 modi diversi per ottenere il valore dell'identità attuale

AMBITO_IDENTITÀ();è la soluzione migliore.E se stai utilizzando .NET, passa semplicemente un nostro parametro e controlla il valore dopo l'esecuzione della procedura.

CREATE PROCEDURE [dbo].[InsertProducts]
    @id             INT             = NULL OUT,
    @name           VARCHAR(150)    = NULL,
    @desc           VARCHAR(250)    = NULL

AS

    INSERT INTO dbo.Products
       (Name,
        Description)
    VALUES
       (@name,
        @desc)

    SET @id = SCOPE_IDENTITY();

Devi selezionare la funzione scope_identity().

Per fare ciò dal codice dell'applicazione, normalmente incapsulo questo processo in una procedura memorizzata in modo che sembri ancora una query alla mia applicazione.

Tendo a preferire allegare un trigger alla tabella utilizzando Enterprise Manager.In questo modo non devi preoccuparti di scrivere istruzioni SQL aggiuntive nel tuo codice.Il mio assomiglia a questo:

Crea trigger tblname su dbo.tblname per inserire come seleziona new_id = @@ Identity

Quindi, dall'interno del tuo codice, tratta le istruzioni insert come istruzioni select: esegui e valuta semplicemente i risultati.la colonna "newID" conterrà l'identità della riga appena creata.

Questa è probabilmente la migliore soluzione funzionante che ho trovato per SQL Server.SQL Server restituisce il valore della colonna identità dopo l'istruzione di inserimento

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top