Manipular un identity de una columna con dbcc checkident

En este artículo chiquitito les contaré como manipular el valor de un campo con identity.

Hay una instrucción en T-SQL que se llama dbcc checkident  que sirve para manipular campos con identity, entre otras cosas, puede servir para resetear el contador (de una forma parecida que truncate, pero sin borrar datos).

Para este ejemplo, crearemos una tabla:


CREATE TABLE MiTable
(
id INT IDENTITY(1,1) NOT NULL,
fecha DATETIME NOT NULL
)

E insertaremos 3 valores

INSERT INTO MiTabla (fecha) VALUES (GETDATE())
INSERT INTO MiTabla (fecha) VALUES (GETDATE())
INSERT INTO MiTabla (fecha) VALUES (GETDATE())

Chequearemos con dbcc checkident el ultimo valor generado:
dbcc checkident('MiTabla',NORESEED)
Y debiera entregar algo más o menos así:

Checking identity information: current identity value ‘3’, current column value ‘3’.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Bien, sabemos el último elemento insertado es el 3 y el próximo será el 4. ¿Cómo lo hacemos para que el próximo elemento sea el 20? Fácil:
dbcc checkident('MiTabla',RESEED,19)
Debiera decir algo así:

Checking identity information: current identity value ‘3’.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Ahora insertemos un valor más:
INSERT INTO MiTabla (fecha) VALUES (GETDATE())
Y consultamos por el ultimo valor:
SELECT TOP 1 * FROM MiTabla ORDER BY id DESC
Vemos que el id es 20.

Tomen nota que se toma el numero anterior al valor que queremos que se genere cuando se indica con dbcc checkident.

También funciona con valores negativos:
dbcc checkident('MiTabla',RESEED,-19)
Ahora insertemos un valor más:
INSERT INTO MiTabla (fecha) VALUES (GETDATE())
Y consultamos por el ultimo valor:
SELECT TOP 1 * FROM MiTabla ORDER BY id ASC
Vemos que el id es -18.

¡Chau!

Diferencia entre SELECT @@IDENTITY, SELECT SCOPE_IDENTITY() y SELECT IDENT_CURRENT(‘tabla’)

Hola Mundo

No es una novedad que en los motores de bases de datos exista una función que sirva para generar números de forma correlativa, o bien, definiendo un inicio y un incremento. Por ejemplo, en MySQL existe auto_increment y en SQL Server se llama identity.

Aprovecho estas líneas para tirar las orejas de aquellos desarrolladores que usan estas funciones de auto incremento como claves primarias. Hay muchas funciones que generan valores únicos y que son justamente para eso.

Volviendo al tema. En SQL Server existen 3 funciones que permiten saber el último número generado con identity. Estas funciones se ámbito en el ámbito en el cual operan.

SELECT @@IDENTITY

Esto devolverá el último valor generado con identity. No importa donde haya sido, simplemente lo mostrará.

SELECT SCOPE_IDENTITY()

Devolverá el último valor generado en el ámbito. Por ejemplo, si se está trabajando dentro de un trigger, devolverá el último valor que identity generó dentro del trigger.

SELECT IDENT_CURRENT(‘tabla’)

Devolverá el último valor generado en la tabla que se especifica.

 

Ojalá que les sirva.

 

Chau