J'ai googlé ce problème une semaine et aucune chose d'utile je pense n'utilise pas le mot correct
J'utilise SQL Server 2008 avec t-sql et mon besoin est d'optimiser ma fonction lorsque j'insère une nouvelle ligne.
J'ai une table avec la première colonne est la clé du type entier auto-incrémenté et les autres colonnes sont juste pour information
Quand nous faisons une insertion, SQL Server incrémente automatiquement la clé et je dois faire un select max pour obtenir la valeur. Il existe donc un moyen semblable à une variable globale comme @@IDENTITY
ou à une fonction permettant d'éviter la transaction begin end et select max.
Utilisez SCOPE_IDENTITY
:
-- do insert
SELECT SCOPE_IDENTITY();
Ce qui vous donnera:
La dernière valeur d'identité insérée dans une colonne d'identité dans la même portée. Une étendue est un module: une procédure stockée, un déclencheur, fonction, ou lot. Par conséquent, deux instructions ont la même portée si ils sont dans la même procédure stockée, fonction ou lot.
Je viens de lancer le code:
INSERT INTO Persons (FirstName) VALUES ('Joe');
SELECT ID AS LastID FROM Persons WHERE ID = @@Identity;
et ça marche aussi!
Qu'en est-il de la dernière valeur d'incrémentation automatique
SELECT IDENT_CURRENT('tableName')-IDENT_INCR('tableName');
Dans mon cas, je devais utiliser @@ Identity, car je m'inscrivais dans une vue. Il semble que SCOPE_IDENTITY ne fonctionne que pour ceux que vous avez explicitement créés.
Vois ici:
@@ IDENTITY renverra la dernière valeur d'identité entrée dans une table dans votre session en cours. Alors que @@ IDENTITY est limité au .__ actuel. session, il n’est pas limité à la portée actuelle. Si vous avez un déclencheur sur une table qui crée une identité dans une autre table, vous obtiendra l'identité qui a été créée en dernier, même s'il s'agissait du déclencheur qui l'a créé.