SR0008: Considere o uso de SCOPE_IDENTITY em vez de @ @ IDENTITY

RuleId

SR0008

<strong>Categoria</strong>

Microsoft.design

Alteração significativa

Não-separável

Causa

Seu código contém um @@IDENTITY chamada.

Descrição da regra

Porque @@IDENTITY é um valor de identidade global podem ter sido atualizado fora do escopo atual e obteve valor inesperado. Disparadores, incluindo disparadores aninhados, usados pela replicação, poderá atualizar @@IDENTITY fora do escopo atual.

Como corrigir violações

Para resolver esse problema, você deve substituir as referências a @@IDENTITY com SCOPE_IDENTITY, que retorna o valor de identidade mais recente no escopo da instrução do usuário.

Quando suprimir avisos

Você pode suprimir este aviso se a instrução que usa @@IDENTITY é usado quando você tiver certeza de que nenhum outro processamento talvez tenha atualizado o valor de @@IDENTITY. No entanto, é altamente recomendável que você resolva o aviso, em vez de supressão de porque SCOPE_IDENTITY fornece o valor pretendido, sem o risco de alterações inesperadas.

Exemplo

No primeiro exemplo, @ @ IDENTITY é usado em um procedimento armazenado que insere dados em uma tabela. Então, a tabela é publicada para replicação de mesclagem, que adiciona disparadores às tabelas que são publicadas. Portanto, @ @ IDENTITY pode retornar o valor da operação de inserção em uma tabela de sistema de replicação em vez da operação de inserção em uma tabela do usuário.

A tabela de Sales. Customer tem um valor máximo de identidade de 29483. Se você inserir uma linha na tabela, @ @ IDENTITY e SCOPE_IDENTITY () retornam valores diferentes. SCOPE_IDENTITY () retorna o valor da operação de inserção na tabela de usuário, mas o @ @ IDENTITY retorna o valor da operação de inserção na tabela de sistema de replicação.

O segundo exemplo mostra como você pode usar SCOPE_IDENTITY () para acessar o valor inserido de identidade e resolver o aviso.

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

Consulte também

Conceitos

Analisando o código do banco de dados para melhorar a qualidade do código