SR0008 : Utilisez SCOPE_IDENTITY plutôt que @@IDENTITY

Id de la règle

SR0008

Catégorie

Microsoft.CSharp

Modification avec rupture

Modification sans rupture

Cause

Votre code contient un appel @@IDENTITY.

Description de la règle

Étant donné que @@IDENTITY est une valeur d'identité globale, il a pu être mis à jour à l'extérieur de la portée actuelle et a obtenu une valeur inattendue. Les déclencheurs, notamment les déclencheurs imbriqués utilisés par réplication, peuvent mettre à jour @@IDENTITY à l'extérieur de votre portée actuelle.

Comment corriger les violations

Pour résoudre ce problème, vous devez remplacer les références à @@IDENTITY par SCOPE_IDENTITY, ce qui retourne la valeur d'identité la plus récente dans la portée de l'instruction utilisateur.

Quand supprimer les avertissements

Vous pouvez supprimer cet avertissement si l'instruction qui utilise @@IDENTITY est utilisée une fois que vous vous êtes assuré qu'aucun autre traitement n'a pu mettre à jour la valeur de @@IDENTITY. Toutefois, nous vous recommandons fortement de résoudre l'avertissement au lieu de le supprimer car SCOPE_IDENTITY fournit la valeur prévue sans risque de modifications inattendues.

Exemple

Dans le premier exemple, @@IDENTITY est utilisée dans une procédure stockée qui insère des données dans une table. La table est alors publiée pour la réplication de fusion, qui ajoute des déclencheurs aux tables publiées. Par conséquent, @@IDENTITY peut retourner la valeur de l'opération d'insertion dans une table système de réplication au lieu de l'opération d'insertion dans une table utilisateur.

La table Sales.Customer a une valeur d'identité maximale de 29483. Si vous insérez une ligne dans la table, @@IDENTITY et SCOPE_IDENTITY() retournent des valeurs différentes. SCOPE_IDENTITY() retourne la valeur de l'opération d'insertion dans la table utilisateur, mais @@IDENTITY retourne la valeur de l'opération d'insertion dans la table système de réplication.

Le deuxième exemple indique comment vous pouvez utiliser SCOPE_IDENTITY() pour accéder à la valeur d'identité insérée et résoudre l'avertissement.

CREATE PROCEDURE [dbo].[ProcedureWithWarning]
@param1 INT, 
@param2 NCHAR(1),
@Param3 INT OUTPUT
AS
BEGIN
INSERT INTO Sales.Customer ([TerritoryID],[CustomerType]) VALUES (@param1,@param2);

SELECT @Param3 = @@IDENTITY
END

CREATE PROCEDURE [dbo].[ProcedureFixed]
@param1 INT, 
@param2 NCHAR(1),
@param3 INT OUTPUT
AS
BEGIN
INSERT INTO Sales.Customer ([TerritoryID],[CustomerType]) VALUES (@param1,@param2);

SELECT @Param3 = SCOPE_IDENTITY()
END

Voir aussi

Concepts

Analyse du code de base de données pour en améliorer la qualité