2013-08-01 9 views
26

È possibile in SQL Server utilizzare la stored procedure per restituire il valore della colonna Identity in una tabella rispetto alla quale vengono inseriti alcuni valori? Ad esempio, utilizzando stored procedure, se inseriamo i dati in una tabella:Sql Server restituisce il valore della colonna Identity dopo l'istruzione insert

Tabella TBL

  • intero UserID, identità, auto-increment
  • Nome varchar
  • UserName varchar
  • password varchar

Quindi, se eseguo la procedura di archiviazione inserendo alcuni valori come:

Insert into TBL (Name, UserName, Password) 
Values ('example', 'example', '$2a$12$00WFrz3dOfLaIgpTYRJ9CeuB6VicjLGhLset8WtFrzvtpRekcP1lq') 

Come posso restituire il valore di UserID al quale verrà effettuato questo inserimento. Ho bisogno del valore di UserID per alcune altre operazioni, qualcuno può risolvere questo?

+1

possibile duplicato di [Il modo migliore per ottenere l'identità della riga inserita?] (Http://stackoverflow.com/questions/42648/best-way-to-get-identity-of-inserted-row) – bummi

+0

Possibile duplicato di [SQL Server: restituisce il valore dopo INSERT] (http://stackoverflow.com/questions/7917695/sql-server-return-value-after-insert) –

risposta

61
Insert into TBL (Name, UserName, Password) Output Inserted.IdentityColumnName 
Values ('example', 'example', 'example') 
+0

@Parado grazie anche il tuo modo è bello –

+0

Questo funziona bene, grazie – user2599269

+0

@ user2599269 benvenuto –

8

invia un outp Parametro ut come

@newId int output 

presso l'uso finale

select @newId = Scope_Identity() 

    return @newID 
0

è possibile utilizzare Select @@ IDENTITY così

+5

Si prega di non utilizzare questo, poiché @@ IDENTITY restituisce l'ultimo valore di identità utilizzato per TUTTI gli ambiti, non solo quello corrente, che può essere errato. – Oliver

3

È possibile esplicitamente tornare colonne identità utilizzando clausola OUTPUT di SqlServer: Supponendo di aver un/colonna a incremento automatico identità chiamato ID:

$sql='INSERT INTO [xyz].[myTable] (Field1, Field2, Field3) OUTPUT Inserted.ID VALUES (1, 2, '3')'; 

Si noti che in Perl DBI si farebbe poi eseguire l'istruzione INSERT, proprio come se fosse un SELECT. E catturare l'output come se fosse un SELEZIONA

$sth->execute($sql); 
@row=$sth->fetchrow_array; #Only 1 val in 1 row returned 
print "Inserted ID: ", $row[0], "\n"; 

Presumibilmente questo è preferibile in quanto non necessita di un'altra richiesta.

+0

Qual è la differenza rispetto alla risposta accettata? –

0

@@ IDENTITY

Dopo un INSERT, SELECT INTO, o una dichiarazione copia di massa è stata completata, @@ IDENTITY contiene il valore di identità ultima che viene generato dalla dichiarazione. Se l'istruzione non ha influenzato alcuna tabella con colonne Identity, @@ IDENTITY restituisce NULL. Se vengono inserite più righe, generando più valori di identità, @@ IDENTITY restituisce l'ultimo valore di identità generato. Se l'istruzione attiva uno o più trigger che eseguono inserimenti che generano valori di identità, chiamando @@ IDENTITY immediatamente dopo l'istruzione restituisce l'ultimo valore di identità generato dai trigger. Se viene attivato un trigger dopo un'azione di inserimento su una tabella con una colonna Identity e il trigger viene inserito in un'altra tabella che non dispone di una colonna Identity, @@ IDENTITY restituisce il valore Identity del primo inserto. Il valore @@ IDENTITY non ripristina un'impostazione precedente se l'istruzione INSERT o SELECT INTO o la copia bulk non riesce o se la transazione viene annullata.

6

Per recuperare l'ultimo valore di identità generato. Il modo più comune è utilizzare SCOPE_IDENTITY() integrato nella funzione.

A parte, da questo, si hanno anche @@ IDENTITY e IDENT_CURRENT ('TableName') funzione.

Select SCOPE_IDENTITY() 
Select @@IDENTITY 
Select IDENT_CURRENT('tblPerson') 

SCOPE_IDENTITY() - restituisce l'ultimo valore Identity che si crea nella stessa sessione e nello stesso ambito.

@@ IDENTITY - restituisce l'ultimo valore di identità creato nella stessa sessione e su qualsiasi ambito.

IDENT_CURRENT ('TableName') - restituisce l'ultimo valore di identità creato per una tabella specifica attraverso qualsiasi sessione e qualsiasi ambito.

Per esempio:

SCOPE_IDENTITY() restituisce il valore di identità ultima che viene creato nella stessa sessione (Connection) e nello stesso ambito (nella stessa stored procedure, funzioni, trigger).

Diciamo, ho 2 tavoli tblPerson1 e tblPerson2, e ho un trigger sul tavolo tblPerson1, che sarà inserire un record nella tabella di tblPerson2. Ora, quando si inserisce un record nella tabella tblPerson1, SCOPE_IDENTITY() restituisce il valore di idetentità generato nella tabella tblPerson1

Dove restituisce @@ IDENTITY, il valore generato nella tabella tblPerson2. Quindi, @@ IDENTITY restituisce l'ultimo valore di identità creato nella stessa sessione senza considerare l'ambito.

IDENT_CURRENT ('tblPerson') restituisce l'ultimo valore di identità creato per una tabella specifica attraverso qualsiasi sessione e qualsiasi ambito.

Problemi correlati