En este tutorial paso a paso te muestro como podes hacer insert en tus tablas cuando necesitas que los números (por ejemplo un ID) deban ser secuenciales y además evitar saltos en sus datos.
Código utilizado en el video
/*
NUMERAR REGISTROS SIN DUPLICADOS Y SALTOS
*/
-- EJEMPLO 1 (USO DE IDENTITY)
USE master
GO
DROP DATABASE IF EXISTS DEMO_NUMERADOR
GO
CREATE DATABASE DEMO_NUMERADOR
GO
USE DEMO_NUMERADOR
GO
CREATE TABLE TEST1 (ID INT IDENTITY(1,1) PRIMARY KEY,
C1 INT,
C2 DATE)
-- INSERT OK
INSERT INTO TEST1 (C1,C2)
VALUES (1,GETDATE())
SELECT * FROM TEST1
-- INSERT NO OK
INSERT INTO TEST1 (C1,C2)
VALUES ('H',GETDATE())
-- INSERT OK
INSERT INTO TEST1 (C1,C2)
VALUES (2,GETDATE())
SELECT * FROM TEST1
DROP TABLE TEST1
------------------------------------------
---- EJEMPLO 2 CON TABLA -----------------
------------------------------------------
DROP TABLE IF EXISTS NUMERADOR
CREATE TABLE NUMERADOR (TABLA VARCHAR(255),
ULTIMO_NUMERO INT)
INSERT INTO NUMERADOR VALUES ('TEST1',0)
CREATE TABLE TEST1 (ID INT PRIMARY KEY,
C1 INT,
C2 DATE)
-- PROCESO CON UPDATE
DECLARE @NRO INT
BEGIN TRAN
UPDATE NUMERADOR SET
@NRO = ULTIMO_NUMERO = ULTIMO_NUMERO+1
WHERE TABLA = 'TEST1'
INSERT INTO TEST1 (ID,C1,C2)
VALUES (@NRO,1,GETDATE())
COMMIT TRAN
GO 3
SELECT * FROM NUMERADOR
SELECT * FROM TEST1
-- HACEMOS FALLAR
DECLARE @NRO INT
BEGIN TRAN
UPDATE NUMERADOR SET
@NRO = ULTIMO_NUMERO = ULTIMO_NUMERO+1
WHERE TABLA = 'TEST1'
INSERT INTO TEST1 (ID,C1,C2)
VALUES (@NRO,'H',GETDATE())
COMMIT TRAN
-- VOLVEMOS A INSERTAR UNO NUEVO
DECLARE @NRO INT
BEGIN TRAN
UPDATE NUMERADOR SET
@NRO = ULTIMO_NUMERO = ULTIMO_NUMERO+1
WHERE TABLA = 'TEST1'
INSERT INTO TEST1 (ID,C1,C2)
VALUES (@NRO,1,GETDATE())
COMMIT TRAN
SELECT * FROM NUMERADOR
SELECT * FROM TEST1
--- PROBAMOS CONCURRENCIA (SESION 1)
DECLARE @NRO INT
BEGIN TRAN
UPDATE NUMERADOR SET
@NRO = ULTIMO_NUMERO = ULTIMO_NUMERO+1
WHERE TABLA = 'TEST1'
INSERT INTO TEST1 (ID,C1,C2)
VALUES (@NRO,1,GETDATE())
-- ROLLBACK TRAN
-- COMMIT TRAN
--- PROBAMOS CONCURRENCIA (SESION 2)
USE DEMO_NUMERADOR
GO
DECLARE @NRO INT
BEGIN TRAN
UPDATE NUMERADOR SET
@NRO = ULTIMO_NUMERO = ULTIMO_NUMERO+1
WHERE TABLA = 'TEST1'
INSERT INTO TEST1 (ID,C1,C2)
VALUES (@NRO,1,GETDATE())
COMMIT TRAN
-- VEMOS VALORES
SELECT * FROM TEST1
SELECT * FROM NUMERADOR