quarta-feira, 15 de fevereiro de 2012

Retornando o valor do IDENTITY – Sql Server

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: