MCDBA Brasil


  • Home
  • Sobre
  • Contato

Livros





Links Rápidos

SQL Server Builds (All Versions/Editions)


Download SQL Server 2017 (trial)


SQL Server 2017 Feature Pack


SQL Server 2016 Feature Pack


Cumulative Update SQL Server 2017 builds


Cumulative Update SQL Server 2016 builds


Cumulative Update SQL Server 2014 builds


Cumulative Update SQL Server 2012 builds


SQL Server 2005/2008 Samples Databases


Documentando o Servidor SQL Server


Analisando a Performance do Servidor-CheckList


Virtual PASS PT


Faça parte do maior virtual chapter do PASS com conteúdos técnicos em Português sobre SQL Server.

Todos os meses um evento Online para você! Acompanhe aqui os WebCasts já agendados

Sindicalize seu blog ou site ao VirtualPASSPT

SQL Server Blogs

SQL Server Query Processing Team


SQL Programmability & API Development Team


SQL Server Manageability Team


Latin America Support Team


Database + Disk + Performance


Microsoft SQL Server Support


SQL CLR Team


SQL Query Optimization Team


SQL 2005 Code Samples


SQL Server Express Team


SQL SMO Samples


SQL Storage Engine Team


SQL CAT Team


SQL Protocols Team


PSS SQL Server Engineers


Slava Oks on SQLOS


Ken Henderson’s blog


LUTI@Microsoft Blog


kimberly L. Trip’s blog


Fernando Garcia Blog

Dica da Semana

Trabalhando com @@IDENTITY, SCOPE_IDENTITY e IDENT_CURRENT

por Nilton Pinheiro setembro 27, 2004 Nenhum comentário

Para um melhor entendimento vamos supor o seguinte exemplo:


Você possui duas tabelas T1,T2 e uma trigger de INSERT definida em T1.
Quando um registro é inserido na tabela T1, a trigger dispara e insere um registro na tabela T2. Este senário ilustra dois escopos: o insert em T1 e o insert em T2 como resultado do disparo da trigger.


Assumindo que T1 e T2 possuem coluna IDENTITY, @@IDENTITY e SCOPE_IDENTITY retornarão valores diferentes no final do INSERT sobre T1.


Script do exemplo:


USE tempdb
GO
CREATE TABLE T1 (
   Z_id  int IDENTITY(1,1)PRIMARY KEY,
   Z_name varchar(20) NOT NULL)


INSERT T1
   VALUES (‘Lisa’)
INSERT T1
   VALUES (‘Mike’)
INSERT T1
   VALUES (‘Carla’)


SELECT * FROM T1


— Registros em T1
Z_id   Z_name
————-
1      Lisa
2      Mike
3      Carla


CREATE TABLE T2 (
   Y_id  int IDENTITY(100,5)PRIMARY KEY,
   Y_name varchar(20) NULL)


INSERT T2 (Y_name)
   VALUES (‘boathouse’)
INSERT T2 (Y_name)
   VALUES (‘rocks’)
INSERT T2 (Y_name)
   VALUES (‘elevator’)


SELECT * FROM T2


— Registros em T2
Y_id  Y_name
—————
100   boathouse
105   rocks
110   elevator


/* Cria uma trigger que insere um registro em T2 quando um registro é inserido em T1 */
CREATE TRIGGER T1_trig
ON T1
FOR INSERT AS
   BEGIN
   INSERT T2 VALUES (”)
   END


@@IDENTITY


Apesar de @@IDENTITY ser conhecido como uma variável global, ele é isolado por sessão, ou seja, retorna o último valor identity inserido em qualquer tabela desde que seja na sessão corrente. Entenda sessão como sendo uma conexão.


Exemplo:


/* Dispara a trigger e retorna o valor obtido para @@IDENTITY */
INSERT T1 VALUES (‘Rosalie’)
SELECT @@IDENTITY AS [@@IDENTITY] — Retorna 115 – valor identity inserido sobre a tabela T2
GO


O problema aqui é que a tabela T1 possui um trigger que também gera insert em outra tabela com identity (T2). O valor de @@IDENTITY é alterado devido ao insert realizado pelo trigger, desta forma o valor que será retornado não é o identity para T1, mas sim o identity para T2.



IDENT_CURRENT()


IDENT_CURRENT não é limitado por escopo ou sessão, mas sim por uma tabela em específico. IDENT_CURRENT retorna o último valor identity inserido em uma determinada tabela em qualquer sessão ou escopo.


Exemplo:


/* Dispara a trigger e retorna o valor obtido para IDENT_CURRENT */
INSERT T1 VALUES (‘Rosalie’)
SELECT IDENT_CURRENT(‘T1’) AS [IDENT_CURRENT] — Retorna 4 – valor identity inserido sobre a tabela T1
GO


Se estiver testando isso, irá parecer que funcionou, devolverá o valor identity para a tabela T1. O problema é que o IDENT_CURRENT não está preso a uma sessão, então se estiver ocorrendo inserções simultâneas sobre a tabela T1, o valor que ele poderá estar retornando pode não ser o da sua inserção.


SCOPE_IDENTITY()


Assim como @@IDENTITY, SCOPE_IDENTITY() retornará o último valor identity inserido em qualquer tabela na sessão corrente.


Exemplo:


/* Dispara a trigger e retorna o valor obtido para SCOPE_IDENTITY */
INSERT T1 VALUES (‘Rosalie’)
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]  — Retorna 4 – valor identity inserido sobre a tabela T1
GO


Entretando, SCOPE_IDENTITY é limitado a um escopo e com isso retornará o último valor identity inserido dentro do escopo de um determinado batch. Como o trigger é considerado um outro escopo, o valor de identity da tabela T1 será devolvido corretamente.


Para saber mais sobre @@Identity, ident_current() ou scope_identity(), consulte o Books Online do SQL Server 2000.

Avaliação:
Compartilhe:
  • Anterior Entendendo o Log de Transação21 anos atrás
  • Próximo Identificando sua versão do SQL Server21 anos atrás

Deixe uma resposta Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

MVP Reconnect Award

Categorias

  • Artigos (359)
  • Dica da Semana (95)
  • Documentação (54)
  • Downloads (113)
  • MSDE 2000 (3)
  • Sem categoria (1)
  • Tutoriais (9)

Posts recentes

  • #FechouBrasil #PartiuPortugal
  • Brigando com o erro “The cached MSI file is missing”
  • MCDBABRASIL está de volta
  • Documentando o Servidor SQL Server
  • Brigando com os Erros 17182, 17826 e 17120

SQL Server AlwaysOn Video Series

Video1: Introdução ao SQLServer2012 AlwaysOn


Video2: Introdução ao SQLServer2012 AlwaysOn Availability Group


Video3: Introdução ao SQLServer2012 AlwaysOn AVG-Demo


Video4: Introdução ao SQLServer2012 AlwaysOn Listener


Video5: Introdução ao SQLServer2012 AlwaysOn Readable Secondaries


Video6: Introdução ao SQLServer2012 AlwaysOn Readable Secondaries-Demo


Video7: Introdução ao SQLServer2012 AlwaysOn Failover Clustering


Serie SQL Server Failover Clustering End-to-End

Parte 1: Configuração da Rede e Ambiente


Parte 2: Configurando o Windows 2008 R2 Domain Controler e DNS


Parte 3: Preparando os nós para o Failover Cluster


Parte 4: Configurando um Failover Cluster de 2 nós


Parte 5: Configurando as LUNs no iSCSI Software Target (Parte 1)


Parte 6: Configurando as LUNs no iSCSI Software Target (Parte 2)


Parte 7: Apresentando as LUNs para os nós do Failover Cluster


Parte 8: Configurando os discos no Failover Cluster


Parte 9: Instalando a primeira instância virtual do SQL Server 2008


Parte 10: Instalando a segunda instância virtual do SQL Server 2008


Parte 11: Instalando e Configurando o MSDTC no Failover Cluster


Parte 12: Configurando Mount Points no Cluster e SQL Server 2008


Vídeo Extra: Removendo uma Instância do SQL Server 2008 R2 em Cluster


Alta Disponibilidade no SQL Server 2008 R2: Failover Clustering Overview


Alta Disponibilidade no SQL Server 2008 R2: Failover Clustering na Prática

Menu

  • Home
  • Sobre
  • Contato

Mais

  • RSS Feeds
2026 MCDBA Brasil.