O Identity funciona como a Sequence no Oracle, uma vez indicado para a coluna de uma tabela que ela é identity ao inserir registros nessa tabela automaticamente iniciara o funcionamento da sequence.
Vamos aos exemplos:
Primeiro criaremos a tabela TbNotaFiscal onde o campo de código da nota fiscal será identity:
Create table TbNotaFiscal (
 CdNotaFiscal int not null identity, 
 VrTotal numeric(10,4) null)
go
Agora vamos incluir uma nota fiscal:
insert into TbNotaFiscal  (VrTotal) values (10.20)
go 
1 record(s) affected
Perceba que no insert acima não foi passado o código da Nota Fiscal, o mesmo foi gerado automaticamente:
Select * from TbNotaFiscal
CdNotaFiscal     VrTotal    
-----------------         ---------- 
1                         10,2     
Agora como podemos indentificar a posição atual da sequence ou último valor corrente. No Oracle podemos facilmente identicar através de consulta na sessão( select Nome_Sequence.currval from dual) mas e no Sql Server?
Temos 3 maneiras de indentificar qual foi o último identity adicionado na tabela, vamos exemplificar:
@@IDENTITY
Sua função é retornar o ultimo identity inserido em qualquer tabela do bloco em execução.
insert into TbNotaFiscal values (50)
go
Select @@identity
go
select * from TbNotaFiscal
go
1 record(s) affected
column1    
---------- 
2          Após ter inserido o registro mostra qual o último identity 
1 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 16/ms]
CdNotaFiscal     VrTotal    
---------------         ---------- 
1                     10,2       
2                     50          
2 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
Ainda no exemplo @@Identity, e se a tabela TbNotaFiscal tivesse uma trigger que insere em uma tabela de Log o nome do usuário que criou essa Nota Fiscal. Se essa tabela de Log também possuir um campo indentity, qual seria o valor retornado para @@Identity? Vamos lá.
Primeiro criaremos a tabela de Log:
Create Table TbNotaFiscalLog (
 CdNotaFiscal int not null identity, 
 VrTotal numeric(10,4) null,
 NmUsuario varchar(100) null) 
Agora vamos criar a Trigger:
CREATE TRIGGER trg_NotaFiscalLog 
ON TbNotaFiscal
AFTER INSERT 
AS 
    INSERT INTO TbNotaFiscalLog (VrTotal, NmUsuario) 
    SELECT VrTotal, USER_NAME() 
    FROM INSERTED 
Vamos agora inserir um registro na tabela de Nota Fiscal e ver qual o valor retornado em @@Identity:
insert into TbNotaFiscal values (100)
go
Select @@identity
go
Select * from TbNotaFiscal
go
1 record(s) affected
1 record(s) affected
column1    
---------- 
1          Veja que o valor retornado foi o da tabela TbNotaFiscalLog -  executado pela trigger 
1 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
CdNotaFiscal     VrTotal    
---------------          ---------- 
1                      10,2       
2                      50         
3                     100         
3 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
SCOPE_IDENTITY()
Retorna o último identity do bloco atual que esta em evidência, ou seja, utilizando nosso mesmo exemplo ao inserir um registro na tabela TbNotaFiscal não seria mais apresentado o identity gerado no insert da trigger e sim do bloco atual e execução. Exemplos:
insert into TbNotaFiscal values (200)
go
Select scope_identity()
go
Select * from TbNotaFiscal
go
1 record(s) affected
1 record(s) affected
column1    
---------- 
4          Veja que agora o valor apresentado foi o da tabela TbNotaFiscal e não mais o gerado na trigger pela tabela de Log 
1 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
CdNotaFiscal     VrTotal    
---------------           ---------- 
1                       10,2       
2                       50         
3                      100        
4                      200         
4 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
IDENT_CURRENT()
Permite passar como parametro o nome da tabela retornando o último valor de indentity para a ela. Exemplo:
insert into TbNotaFiscal values (300)
go
Select ident_current('TbNotaFiscal')
go
select ident_current('TbNotaFiscalLog')
go
Select * from TbNotaFiscal
go
select * from TbNotaFiscalLog
go
1 record(s) affected
1 record(s) affected
column1    
---------- 
5          Identity da tabela TbNotaFiscal 
1 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
column1    
---------- 
3          Identity da tabela TbNotaFiscalLog 
1 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
CdNotaFiscal     VrTotal    
---------------          ---------- 
1                      10,2       
2                      50         
3                     100        
4                     200        
5                     300         
5 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
CdNotaFiscal     VrTotal     NmUsuario    
---------------           ----------      ------------ 
1                       100           TESTE        
2                       200           TESTE    
3                       300           TESTE      
3 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
É isso ai….
[]s
 
 
Nenhum comentário:
Postar um comentário