Thiago Zavaschi R2 www.zavaschi.com

2Jun/090

Repostagem – Utilizando Campos Identity no SQL Server

Olá a todos!
Primeiramente gostaria de dizer que este é um post para o nível iniciante, e serve como base para aquelas perguntas “como é que eu fazia aquilo mesmo?”. É baseado em um mini artigo que escrevi, e este post também já publiquei no DevBR.

Em muitas ocasiões nos deparamos com situações em que precisamos trabalhar em alguma coluna que seja identity. Este mini-artigo descreve alguns comandos úteis na manipulação destas colunas.

Criando uma tabela com campo identity: Devemos criar com o parâmetro identity, e configurar o primeiro valor, e o valor de incremento, respectivamente (IDENTITY (<inicio>,<incremento>)). Conforme no exemplo a seguir:

CREATE TABLE Tabela ( 
      Id INT IDENTITY (1,1) PRIMARY KEY, 
      Valor VARCHAR(50) 
)

Reiniciando o valor do campo identity: Algumas vezes precisamos alterar o valor do identity (para reiniciar a contagem, por exemplo). Há o comando truncate que além de limpar a tabela (entre outras coisas), também zera o valor do identity. No entanto, se o nosso objetivo é apenas trocar o valor do identity, o truncate não é uma saída interessante. Para manipular o identity podemos fazer como descrito a seguir:

Vamos imaginar que queremos que o próximo registro a ser inserido na tabela Tabela queremos que sua chave primária Id, se inicie em 1.

Para resolver esse problema, podemos usar a seguinte instrução:

DBCC CHECKIDENT (Tabela, reseed, 0)

O último parâmetro se torna o valor atual do identity. Ao inserir o próximo registro, o mesmo virá com o seu Id com o valor identity somado de 1 (caso seja um identity de incremento 1), o valor do identity da tabela vai para 1, e assim por diante.

Recuperar o último valor inserido de um campo identity: Para recuperar o último valor de identity inserido (ex: inserir algo em uma tabela, e cadastrar um novo registro com o id do registro recém inserido), podemos utilizar:

@@IDENTITY, que retorna o valor do identity do último registro inserido na tabela, ou;

SCOPE_IDENTITY(), que retorna o último valor mas dentro do escopo em que a query foi executada.

Não recomendo a utilização de @@IDENTITY, pois isso pode acarretar problemas de consistência em cenários onde existe um alto grau de inserção/manipulação dos dados no banco (ou mais especificamente, na tabela em questão).

Um exemplo simples de uso pode ser:

DECLARE @techId INT 
INSERT INTO Tabela (Valor) VALUES (‘Testando Identity’) 
SELECT @techId = SCOPE_IDENTITY()

---

Um complemento em relação ao post original:

”Zavaschi, e se eu quiser inserir um registro em uma tabela, mas somente nessa inserção quero especificar o valor do campo identity. É possível?”

É sim, basta fazer da seguinte forma:

SET IDENTITY_INSERT Tabela ON
INSERT INTO Tabela (Id, Valor) VALUES (123, ‘Informação’)
SET IDENTITY_INSERT Tabela OFF

 

Simples, mas temos que lembrar que precisamos explicitar os campos, ainda que estejamos fazendo uma inserção em todas as colunas.

É isso, espero que tenham gostado!

Abraços!

Thiago Zavaschi

Comments (0) Trackbacks (0)

No comments yet.


Leave a comment


No trackbacks yet.