Restituzione del id dell ultimo record inserito in una tebella

lunedì 04 settembre 2006 - 10.38

M@LKAV Profilo | Junior Member

Giorno a tutti
Dovre creare una store procedure ma nn sono molto pratico

Praticamente dovrei farmi restituire l'id dell'utlimo record creato in una tabella
qualcuno puo aiutarmi???
Thanks

lbenaglia Profilo | Guru

>Dovre creare una store procedure ma nn sono molto pratico
>
>Praticamente dovrei farmi restituire l'id dell'utlimo record
>creato in una tabella
> qualcuno puo aiutarmi???

Ciao M@LKAV,

Domanda da $1.000.000: con che DBMS?
SQL Server offre storicamente la funzione @@IDENTITY per recuperare l'ultimo valore generato da una operazione di INSERT su una tabella avente una colonna numerica con con l'attrbuto IDENTITY.
Il problema però è che lo scope di questa funzione è a livello di connessione.
Che significa?
Se ad esempio il comando di INSERT della tua sp agisce su una tabella con un trigger di INSERT che va ad aggiornare una seconda tabella con una colonna IDENTITY, la funzione @@IDENTITY ti restituirà il valore generato da quest'ultima tabella invece che quello determinato dalla tua operazione di inserimento.

Per ovviare a questo problema, SQL Server 2000 implementa la funzione SCOPE_IDENTITY() il cui scope è quello locale alla tua procedura/batch e quindi ti restituisce effettivamente il valore generato dalla tua operazione di INSERT.

OK, vediamo di scrivere un piccolo esempio:

USE tempdb; GO /* Creo la tabella dbo.Students */ CREATE TABLE dbo.Students( StudentID int NOT NULL IDENTITY PRIMARY KEY, FirstName varchar(10) NOT NULL, LastName varchar(10) NOT NULL, InsertDate datetime NOT NULL ); GO /* Creo la stored procedure dbo.up_AddStudent */ CREATE PROCEDURE dbo.up_AddStudent( @FirstName varchar(10), @LastName varchar(10) ) AS INSERT dbo.Students VALUES (@FirstName, @LastName, GETDATE()) RETURN SCOPE_IDENTITY(); GO /* Inserisco qualche studente */ DECLARE @StudentID int; EXEC @StudentID = dbo.up_AddStudent 'Lorenzo', 'Benaglia'; SELECT @StudentID AS StudentID; GO /* Output: (1 row(s) affected) StudentID ----------- 1 (1 row(s) affected) */ DECLARE @StudentID int; EXEC @StudentID = dbo.up_AddStudent 'Gianluca', 'Hotz'; SELECT @StudentID AS StudentID; GO /* Output: (1 row(s) affected) StudentID ----------- 2 (1 row(s) affected) */ DECLARE @StudentID int; EXEC @StudentID = dbo.up_AddStudent 'Luca', 'Bianchi'; SELECT @StudentID AS StudentID; GO /* Output: (1 row(s) affected) StudentID ----------- 3 (1 row(s) affected) */ /* Query */ SELECT * FROM dbo.Students; GO /* Output: StudentID FirstName LastName InsertDate ----------- ---------- ---------- ----------------------- 1 Lorenzo Benaglia 2006-09-04 10:47:51.857 2 Gianluca Hotz 2006-09-04 10:48:26.653 3 Luca Bianchi 2006-09-04 10:48:44.000 (3 row(s) affected) */ GO /* Pulizia */ DROP PROCEDURE dbo.up_AddStudent; DROP TABLE dbo.Students;

>Thanks
Prego.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

M@LKAV Profilo | Junior Member

ok provero
il linguaggio e sql server
praticamente sto lavorando con visual basic net.
e quando creo un nuovo record di una tabella devo farmi restituire l'id di quel record per riutilizzarlo

thank l'esempio e stato molto esplicativo
vediamo se riesco a riutilizzarlo

totti240282 Profilo | Guru

e senza sp come si fà ????
C'è solo un capitano !!!!!!

lbenaglia Profilo | Guru

>e senza sp come si fà ????
Non contemplo nemmeno questo caso dato che tutti gli accessi al data tier DEVONO avvenire tramite sp
Ad ogni modo credo che SCOPE_IDENTITY() restituirà NULL se seguita da un scondo batch; il male minore consiste nell'utilizzare @@IDENTITY anche se in caso di triggers di INSERT su tabelle con una colonna IDENTITY restituiranno questo valore.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5