Restablezca cualquier columna de identidad para comenzar con 1 como siguiente valor

Estoy creando un script SQL para restablecer una base de datos. Para hacer esto, quiero vaciar varias tablas (no todas) y restablecer sus valores de identidad a 0.

Para algunas tablas que uso TRUNCATE TABLE, pero esto no funciona cuando la tabla está referenciada por una restricción de clave externa. Para esas tablas que uso DBCC CHECKIDENT(TableName, RESEED, 0). Esto funciona para la mayoría de las tablas, pero no para todas. Si una tabla nunca tuvo datos, el valor de identidad actual es NULL en lugar de 0:

CREATE TABLE TableName (Id int identity, Value varchar(10))
DBCC CHECKIDENT(TableName)

-- Checking identity information: current identity value 'NULL', current column value 'NULL'.

Si uso DBCC CHECKIDENT(TableName, RESEED, 0) en ellos, tendrán 0 como próximo valor de identidad. En cambio, puedo usar 1 como valor de reinicio, pero luego las tablas que han tenido datos comenzarán en 2.

¿Es posible encontrar el siguiente valor de identidad en cualquiera de las vistas del sistema? Si pudiera obtener el siguiente valor en una variable, podría usarlo para establecer el siguiente valor en 0 o 1. Lo he intentado con IDENT_CURRENT('TableName') pero dice 1 para NULL y 0 como valor siguiente.

Y, por favor, no quiero preguntas como "¿por qué necesita que todos comiencen desde 1?" o cualquier otra pregunta que sugiera otro resultado que el que estoy pidiendo.

preguntado el 22 de mayo de 12 a las 09:05

3 Respuestas

Úselo si todas las tablas tienen un campo de identidad.

exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT(''?'', RESEED, 1)'

MSforeachtable es un proceso almacenado indocumentado, pero extremadamente útil, que ejecuta un comando determinado en todas las tablas de su base de datos.

Para reiniciar SOLO tablas con una columna de identidad, puede usar el siguiente script. También hace uso de sp_MSforeachtable pero teniendo en cuenta las tablas correctas.

EXEC sp_MSforeachtable '
IF (SELECT COUNT(1) 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE = ''BASE TABLE'' 
    AND ''[''+ TABLE_SCHEMA + ''].['' + TABLE_NAME + '']'' = ''?'' 
    AND OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), ''TableHasIdentity'') = 1) > 0 
BEGIN
    DBCC CHECKIDENT (''?'', RESEED, 1)
END'

Utilice la siguiente consulta para obtener el valor de Última identidad insertado en las tablas de una base de datos.

   SELECT TableName = OBJECT_NAME(OBJECT_ID) ,
       ColumnName = name ,
       OriginalSeed = seed_value ,
       Step = increment_value ,
       LastValue = last_value ,
       IsNotForReplication = is_not_for_replication
FROM sys.identity_columns

Consulte esto para obtener más detalles.

contestado el 22 de mayo de 12 a las 11:05

OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), 'TableHasIdentity') no me proporciona el valor de identidad actual. Solo dice si la tabla tiene identidad o no. - Pedro Hedberg

@Palpie, la consulta mencionada anteriormente establece el siguiente valor de identidad en 1 si la tabla tiene un campo de identidad. esto se hace en recursión para todas las tablas en la base de datos. Si tiene algún otro requisito, hágamelo saber. - Romil Kumar jainista

IDENT_CURRENT() da como resultado 1 cuando el valor de identidad actual es NULL. DBCC CHECKIDENT('table', RESEED, 0) se comporta diferente cuando el valor de identidad actual es nulo. - Pedro Hedberg

@Palpie, espero que la última consulta publicada en la respuesta haga su trabajo. - Romil Kumar jainista

Parece ser justo lo que estaba buscando. ¡Gracias! - Pedro Hedberg

Para aclarar, ¿quieres básicamente que todas las inserciones futuras comiencen en 1?

No soy un experto en MS-SQL en este tema en particular, pero ¿puede simplemente truncar la tabla, luego restablecer la identidad como sugirió, luego, si la identidad es NULL, inserte un registro (que debería obtener 0) y luego eliminarlo? ¿No dejaría eso que el siguiente registro que se crearía sería 1?

contestado el 22 de mayo de 12 a las 09:05

La dosis truncada no funciona para las tablas a las que se hace referencia mediante una restricción de clave externa. - Pedro Hedberg

Pero sí, quiero que todas las inserciones futuras comiencen en 1. - Pedro Hedberg

Y no debería permitirle truncar en ese caso: si tiene valores en esas columnas de clave externa, estaría rompiendo la integridad, y ese es el punto central de las restricciones. - Cilíndrico

Sé. No cuestioné por qué es así. - Pedro Hedberg

Insertar un registro y luego eliminarlo es una solución, pero si quiero hacer esto en cualquier tabla, creo que es más fácil simplemente eliminar la tabla y volver a crearla. - Pedro Hedberg

Deshabilite la restricción primero:

ALTER TABLE foo NOCHECK CONSTRAINT CK_foo_column 

or

ALTER TABLE foo NOCHECK CONSTRAINT ALL

luego haz un truncado en la mesa

Respondido el 27 de diciembre de 14 a las 00:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.