[ADO.NET, ACCESS, SQL]Ottenere l'ID del prossimo inserimento.

giovedì 29 marzo 2007 - 16.12

gigi90 Profilo | Senior Member

Salve a tutti, è un po che non mi faccio sentire cmq eccomi qua ancora intero.
Vorrei sapere come fare ad ottenere l'indirizzo ID che verrà generato al prossimo inserimento di un record in una tabella:l'id e una chiave primaria, ad autoincremento.
-Vorrei sapere se c'è qualche istruzione specifica SQL per farlo
o
-Siccome utilizzo ASP.NET e quindi ADO.NET per le operazioni sui Database se esiste qualche oggetto ASO.Net o qualche funzione da richiamare per saperlo.

bluland Profilo | Guru

Ciao,
esiste @@identity per sapere l'id generato dopo un inserimento,vedi sul book on line di SQL , a te serve quello successivo??
posta la tua tabella con qualche insert di esempio..


saluti


--------------------
Vincenzo PESANTE

gigi90 Profilo | Senior Member

No, mi serve sapere quello dopo un inserimento!!!
Potresti mostrarmi come si fa??

Grazie

bluland Profilo | Guru

Ecco un esempio:

USE Tempdb CREATE TABLE [Table1] ( [id] [decimal](18, 0) IDENTITY (1, 1) NOT FOR REPLICATION NOT NULL , [Campo] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED ( [id] ) ON [PRIMARY] ) ON [PRIMARY] GO INSERT INTO [tempdb].[dbo].[Table1]( [Campo]) VALUES('prova3') SELECT @@IDENTITY as Id_Creato SELECT * FROM Table1 -- Result Id_Creato ---------------------------------------- 3 id Campo -------------------- -------------------------------------------------- 1 prova 2 prova2 3 prova3

saluti
--------------------
Vincenzo PESANTE

gigi90 Profilo | Senior Member

Ok grazie, però ora scpiegami una cosa, sto studiando da poco il linguaggio SQL, cosa è nel linguaggio SQL un identificatore del tipo @@IDENTITY

alx_81 Profilo | Guru

>Ciao,
Ciao ad entrambi..

>esiste @@identity per sapere l'id generato dopo un inserimento

Fate molta attenzione all'utilizzo di @@identity..
perchè con quella funzione di sistema si ottiene l'ultimo identity inserito e stop.. non necessariamente l'ultimo relativo all'ambito in cui viene eseguito lo statement di inserimento.
Consiglio piuttosto di utilizzare la funzione di sistema SCOPE_IDENTITY() che preserva da ogni problema.. essa ritorna l'identity inserito relativo allo scope di esecuzione dello statement sql di inserimento..


Alx81 =)

http://blogs.dotnethell.it/suxstellino

bluland Profilo | Guru

Si quello che dice Alex è giusto bisogna vedere se è il tuo caso per ogni dubbio ti riporto la definizione:

Le funzioni SCOPE_IDENTITY e @@IDENTITY restituiscono l'ultimo valore Identity generato in una tabella durante la sessione corrente. SCOPE_IDENTITY tuttavia restituisce il valore solo all'interno dell'ambito corrente, mentre @@IDENTITY non è limitata a un ambito specifico.

Si supponga, ad esempio, che siano disponibili le due tabelle T1 e T2 e che in T1 sia definito un trigger INSERT. Quando si inserisce una riga in T1, il trigger viene attivato e viene inserita una riga in T2. Questo esempio illustra due ambiti, ovvero l'inserimento nella tabella T1 e l'inserimento nella tabella T2 come risultato del trigger.

Se è disponibile una colonna Identity sia in T1 che in T2, quando si esegue un'istruzione INSERT nella tabella T1 le funzioni @@IDENTITY e SCOPE_IDENTITY restituiscono valori diversi.

@@IDENTITY restituisce l'ultimo valore della colonna IDENTITY inserito in qualsiasi ambito della sessione corrente, ovvero il valore inserito nella tabella T2.

SCOPE_IDENTITY() restituisce invece il valore IDENTITY inserito nella tabella T1, ovvero il valore inserito durante l'esecuzione dell'ultima istruzione INSERT nello stesso ambito. La funzione SCOPE_IDENTITY() restituisce NULL se viene richiamata prima che nell'ambito specifico venga eseguita un'istruzione INSERT in una colonna Identity.

Vedere gli esempi riportati di seguito.

Esempi
In questo esempio vengono create le due tabelle TZ e TY e il trigger INSERT in TZ. Quando si inserisce una riga nella tabella TZ, il trigger (Ztrig) viene attivato e viene inserita una riga in TY.

USE tempdb
GO
CREATE TABLE TZ (
Z_id int IDENTITY(1,1)PRIMARY KEY,
Z_name varchar(20) NOT NULL)

INSERT TZ
VALUES ('Lisa')
INSERT TZ
VALUES ('Mike')
INSERT TZ
VALUES ('Carla')

SELECT * FROM TZ

--Result set: This is how table TZ looks
Z_id Z_name
-------------
1 Lisa
2 Mike
3 Carla

CREATE TABLE TY (
Y_id int IDENTITY(100,5)PRIMARY KEY,
Y_name varchar(20) NULL)

INSERT TY (Y_name)
VALUES ('boathouse')
INSERT TY (Y_name)
VALUES ('rocks')
INSERT TY (Y_name)
VALUES ('elevator')

SELECT * FROM TY
--Result set: This is how TY looks:
Y_id Y_name
---------------
100 boathouse
105 rocks
110 elevator

/*Create the trigger that inserts a row in table TY
when a row is inserted in table TZ*/
CREATE TRIGGER Ztrig
ON TZ
FOR INSERT AS
BEGIN
INSERT TY VALUES ('')
END

/*FIRE the trigger and find out what identity values you get
with the @@IDENTITY and SCOPE_IDENTITY functions*/
INSERT TZ VALUES ('Rosalie')

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
GO
SELECT @@IDENTITY AS [@@IDENTITY]
GO

--Here is the result set.
SCOPE_IDENTITY
4
/*SCOPE_IDENTITY returned the last identity value in the same scope, which was the insert on table TZ*/

@@IDENTITY
115
/*@@IDENTITY returned the last identity value inserted to TY by the trigger, which fired due to an earlier insert on TZ*/

saluti
--------------------
Vincenzo PESANTE

gigi90 Profilo | Senior Member

Grazie ad entrambi spiegazione piu che esauriente.

alx_81 Profilo | Guru

>Grazie ad entrambi spiegazione piu che esauriente.
Di nulla..
accetta le risposte così chiudiamo il thread..
ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino
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