Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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