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