SR0008: SCOPE_IDENTITY ist @@IDENTITY vorzuziehen

Regel-ID

SR0008

Kategorie

Microsoft.Design

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Der Code enthält einen @@IDENTITY-Aufruf.

Regelbeschreibung

Da @@IDENTITY ein globaler Identitätswert ist, wurde er möglicherweise außerhalb des aktuellen Bereichs aktualisiert und hat einen unerwarteten Wert erhalten. Trigger, einschließlich von der Replikation verwendete geschachtelte Trigger, können @@IDENTITY außerhalb des aktuellen Bereichs aktualisieren.

Behandeln von Verstößen

Um dieses Problem zu beheben, müssen Sie Verweise auf das @@IDENTITY-Objekt durch Verweise auf das SCOPE_IDENTITY-Objekt ersetzen. Dadurch wird der aktuelle Identitätswert im Bereich der Benutzeranweisung zurückgegeben.

Wann sollten Warnungen unterdrückt werden?

Sie können diese Warnung unterdrücken, wenn die Anweisung mit dem @@IDENTITY-Objekt verwendet wird, Sie jedoch sicher sind, dass der Wert des @@IDENTITY-Objekts nicht bei einem anderen Verarbeitungsvorgang aktualisiert wurde. Wir empfehlen jedoch dringend, die Warnung auflösen, statt sie zu unterdrücken, da das SCOPE_IDENTITY-Objekt den gewünschten Wert ohne das Risiko unerwarteter Änderungen bereitstellt.

Beispiel

Im ersten Beispiel wird das @@IDENTITY-Objekt in einer gespeicherten Prozedur verwendet, die Daten in eine Tabelle einfügt. Die Tabelle wird dann zur Mergereplikation veröffentlicht. Dadurch werden den veröffentlichten Tabellen Trigger hinzugefügt. Deshalb kann das @@IDENTITY-Objekt den Wert des Einfügevorgangs in einer Replikationssystemtabelle anstatt in einer Benutzertabelle zurückgeben.

Die Tabelle Sales.Customer verfügt über den maximalen Identitätswert 29483. Wenn Sie eine Zeile in die Tabelle einfügen, geben die Objekte @@IDENTITY und SCOPE_IDENTITY() andere Werte zurück. Das SCOPE_IDENTITY()-Objekt gibt den Wert aus dem Einfügevorgang in der Benutzertabelle zurück, während das @@IDENTITY-Objekt den Wert aus dem Einfügevorgang in der Replikationssystemtabelle zurückgibt.

Im zweiten Beispiel sehen Sie, wie Sie mit dem SCOPE_IDENTITY()-Objekt auf den eingefügten Identitätswert zugreifen und die Warnung auflösen können.

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

Siehe auch

Konzepte

Analysieren von Datenbankcode zum Verbessern der Codequalität