Colunas Identity Parte-III:

Como resetar um repositório identity e função identity() no SELECT INTO

por Paulo Ribeiro

Existem algumas situações em que somos obrigados a resetar um valor identity, atribuindo um novo valor para o próximo identificador. Voltemos a nossa tabela de pedidos (o script para criação encontra-se na segunda parte dessa matéria): vamos supor que o último pedido emitido foi o de número 101, e os pedidos 102, 103 e 104 foram emitidos por processo manual, portanto “fora” do controle da coluna identity. Como não podem existir duplicidades na numeração de pedidos, deveremos “pular” esse range na numeração da coluna identity.

O comando DBCC CHECKIDENT deve ser utilizado para checar e, eventualmente, corrigir o ponteiro responsável pela geração de valores da coluna identity. Se executarmos esse comando para checagem do valor identity na tabela pedido, poderemos confirmar se o último valor utilizado está de acordo com o valor atual da tabela (ver Listagem 1).

select ultimo_pedido=max(id_pedido) from pedido

dbcc checkident(pedido)

go

----------------------------------------------------------------------------------------------------

 

ultimo_pedido

-------------

101

 

Checking identity information: current identity value '101', current column value '101'.

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Listagem 1. Executando DBCC CHECKIDENT para confirmar o último valor identity utilizado

A Listagem 1 confirmou que o pedido de úmero 101 foi o último emitido, e esse valor está de acordo com o ponteiro da coluna identity. Para corrigir o valor identity de modo que o próximo pedido seja o de numeração 105, deveremos acrescentar dois parâmetros no comando DBCC CHECKIDENT: a cláusula RESEED e o valor para correção, que deverá ser igual a 104 (ver Listagem 2)

set nocount on

DBCC CHECKIDENT ('pedido', RESEED, 104)

insert into pedido (dt_emissao,id_emitente)

values ('2005-09-08',211)

select @@identity

go

----------------------------------------------------------------------------------------------------

Checking identity information: current identity value '101', current column value '104'.

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

----------------------------------------

105

Listagem 2. Como alterar o valor do próximo identity

Utilizando a função identity() na criação coluna com o comando SELECT INTO

O comando SELECT INTO é utilizado para criar uma nova tabela à partir do resultado de um SELECT. A função identity – aqui é função e não propriedade - pode ser utilizada nesse comando para criação de uma coluna a propriedade identity na tabela destino. A função identity requer três parâmetros: o tipo de dado, o valor inicial e o incremento (ver Listagem 4 ).

select recnum=identity(smallint,1,1),dt_emissao

into teste_pedido

from pedido

go

select * from teste_pedido

 

----------------------------------------------------------------------------------------------------

(8 row(s) affected)

 

recnum dt_emissao

------ ------------------------------------------------------

1 2005-09-01 00:00:00

2 2005-09-01 00:00:00

3 2005-09-05 00:00:00

4 2005-09-03 00:00:00

5 2005-09-04 00:00:00

6 2005-09-06 00:00:00

7 2005-09-07 00:00:00

8 2005-09-08 00:00:00

 

(8 row(s) affected)

Listagem 4. Utilizando a função identity() com SELECT INTO

Conclusão

Colunas identity são fáceis de implementar e simples de utilizar, basta seguirmos algumas regras quanto à sua manipulação. Com essa matéria encerramos o assunto sobre colunas identity, que foi objeto dessa coluna durante nossos três últimos encontros. Até a próxima !

Leia todos artigos da série