Vorrei reperire l'Id del record appena inserito con una INSERT.
Da quanto ho capito esistono 2 metodi:
SELECT @@IDENTITY e SELECT SCOPE_IDENTITY().
Entrambi agiscono a livello di "sessione" (connessione).
SCOPE_IDENTITY() però è più restrittivo ed agisce a livello di ambito (scope).
Se ho ad esempio qualche trigger che scatta in seguito al mio inserimento nella tabella A, inserendo ad esempio un nuovo record in un'altra tabella B, con @@IDENTITY ottengo l'Id del record inserito nella tabella B mentre con SCOPE_IDENTITY() ottengo l'Id del record inserito nella tabella A.
Quindi... è preferibile usare SCOPE_IDENTITY().
Molte fonti sul web dicono di precedere nel modo seguente:
-----------------------------
SqlConnection conn = new SqlConnection(connString))
string sql = "INSERT INTO TableA (Val1, Val2) VALUES ('aaa', 'bbb'); SELECT SCOPE_IDENTITY();";
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
int newID = (Int32)cmd.ExecuteScalar();
conn.Close();
-----------------------------
Il mio dubbio è questo: se non voglio modificare la query di inserimento accodando con un ; la query "SELECT SCOPE_IDENTITY()" come posso fare?
E' possibile ad esempio procedere nel modo seguente?
-----------------------------
SqlConnection conn = new SqlConnection(connString))
string sql = "INSERT INTO TableA (Val1, Val2) VALUES ('aaa', 'bbb')";
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
cmd.ExecuteNonQuery();
sql = "SELECT SCOPE_IDENTITY()";
SqlCommand cmd2 = new SqlCommand(sql, conn);
int newID = (Int32)cmd.ExecuteScalar();
conn.Close();
-----------------------------
L'esecuzione di diversi command sulla stessa connection mantengono l'ambito (scope)??
Grazie mille
Davide

Rispondi quotando