@@IDENTITY

giovedì 04 novembre 2010 - 11.29
Tag Elenco Tags  VB.NET  |  Visual Studio 2008  |  SQL Server 2008 R2

iif Profilo | Expert

Ciao, spero di essere nel forum giusto.
Eseguendo una insert into vorrei memorizzare in una variabile il valore che ritorna da @@IDENTITY.
Grazie.

lbenaglia Profilo | Guru

>Eseguendo una insert into vorrei memorizzare in una variabile
>il valore che ritorna da @@IDENTITY.

Osserva il seguente esempio:

USE tempdb; CREATE TABLE dbo.foo( fooID int NOT NULL IDENTITY(10,1), col int NOT NULL ); INSERT dbo.foo VALUES(1); DECLARE @NewID int = SCOPE_IDENTITY() SELECT @NewID AS Valore; /* Output: Valore ----------- 10 (1 row(s) affected) */ DROP TABLE dbo.foo;

Ti suggerisco SCOPE_IDENTITY() piuttosto che @@IDENTITY, dato che lo scope è locale e non a livello di sessione, avendo la certezza di recuperare il valore generato dal comando di INSERT della sessione corrente (e non quello generato ad esempio da un trigger di insert scatenato dal comando).

>Grazie.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

iif Profilo | Expert

Posto il codice per maggior chiarezza

Try
Using Connessione As New SqlConnection(strConnessione)
Dim command As New SqlCommand(strSQL, Connessione)
command.Connection.Open()
command.ExecuteNonQuery()
command.CommandText = strSQL_Storico
command.ExecuteNonQuery()
End Using

ApriDs("Select Max(IDOrdine) as ultimo from TB_ORDINI")
Return ds.Tables(0).Rows(0)("ultimo")
ds = Nothing

Il problema si verifica nel momento in cui due inserimenti vengono fatti nello stesso istante.
Pensavo di utilizzare una lock table.

lbenaglia Profilo | Guru

>Posto il codice per maggior chiarezza
>
> Try
>Using Connessione As New SqlConnection(strConnessione)
>Dim command As New SqlCommand(strSQL, Connessione)
> command.Connection.Open()
> command.ExecuteNonQuery()
> command.CommandText = strSQL_Storico
> command.ExecuteNonQuery()
> End Using
>
>ApriDs("Select Max(IDOrdine) as ultimo from TB_ORDINI")
> Return ds.Tables(0).Rows(0)("ultimo")
> ds = Nothing
>
>Il problema si verifica nel momento in cui due inserimenti vengono
>fatti nello stesso istante.
Quale problema?

Ad ogni modo tu non stai recuperando l'ultimo valore di IDENTITY ma stai facendo una query a parte che ti restituisce il massimo valore di un ID.
Se vuoi un consiglio incapsula i due comandi SQL in altrettante stored procedures (o eventualmente in una sola, vedi tu se ha senso) restituendo il valore di IDENTITY (sempre che si tratti di comandi di INSERT) in un parametro di output, richiamando il tutto lato client sempre via SqlCommand.

>Pensavo di utilizzare una lock table.
Lasa stà...

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

iif Profilo | Expert

Esiste un modo per memorizzare il valore @@identity in una variabile?

lbenaglia Profilo | Guru

>Esiste un modo per memorizzare il valore @@identity in una variabile?
Leggi la prima risposta che ti ho dato.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

iif Profilo | Expert

Ma se dovessi memorizzare il valore dentro una variabile vb come da codice?

lbenaglia Profilo | Guru

>Ma se dovessi memorizzare il valore dentro una variabile vb come
>da codice?
Come ho già scritto, utilizza una stored procedure parametrica che valorizzi un parametro di output con il valore restituito dalla funzione SCOPE_IDENTITY() e che andrai a leggere lato client mediante la collection Parameters dell'oggetto SqlCommand:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=20650

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5