Creé un procedimiento almacenado para resolver este problema. Utiliza el INFORMATION_SCHEMA
para buscar las columnas IDENTITY
y luego usa IDENT_CURRENT
y DATA_TYPE
de la columna para calcular el porcentaje completo. Especifique la base de datos como el primer parámetro y luego, opcionalmente, el porcentaje mínimo y el tipo de datos.
EXEC master.dbo.CheckIdentityColumns 'MyDatabase' --all
EXEC master.dbo.CheckIdentityColumns 'MyDatabase', 50 --columns 50% full or greater
EXEC master.dbo.CheckIdentityColumns 'MyDatabase', 50, 'int' --only int columns
Ejemplo de salida:
Table Column Type Percent Full Remaining
------------------------- ------------------ ------- ------------ ---------------
MyDatabase.dbo.Table1 Table1ID int 9 1,937,868,393
MyDatabase.dbo.Table2 Table2ID int 5 2,019,944,894
MyDatabase.dbo.Table3 Table3ID int 9 1,943,793,775
que creó un recordatorio para revisar todos mis bases de datos una vez al mes, y los recopila en una hoja de cálculo.
CheckIdentityColumns Procedimiento
USE master
GO
CREATE PROCEDURE dbo.CheckIdentityColumns
(
@Database AS NVARCHAR(128),
@PercentFull AS TINYINT = 0,
@Type AS VARCHAR(8) = NULL
)
AS
--this procedure assumes you are not using negative numbers in your identity columns
DECLARE @Sql NVARCHAR(3000)
SET @Sql =
'USE ' + @Database + '
SELECT
[Column].TABLE_CATALOG + ''.'' +
[Column].TABLE_SCHEMA + ''.'' +
[Table].TABLE_NAME AS [Table],
[Column].COLUMN_NAME AS [Column],
[Column].DATA_TYPE AS [Type],
CAST((
CASE LOWER([Column].DATA_TYPE)
WHEN ''tinyint''
THEN (IDENT_CURRENT([Table].TABLE_NAME)/255)
WHEN ''smallint''
THEN (IDENT_CURRENT([Table].TABLE_NAME)/32767)
WHEN ''int''
THEN (IDENT_CURRENT([Table].TABLE_NAME)/2147483647)
WHEN ''bigint''
THEN (IDENT_CURRENT([Table].TABLE_NAME)/9223372036854775807)
WHEN ''decimal''
THEN (IDENT_CURRENT([Table].TABLE_NAME)/(([Column].NUMERIC_PRECISION * 10) - 1))
END * 100) AS INT) AS [Percent Full],
REPLACE(CONVERT(VARCHAR(19), CAST(
CASE LOWER([Column].DATA_TYPE)
WHEN ''tinyint''
THEN (255 - IDENT_CURRENT([Table].TABLE_NAME))
WHEN ''smallint''
THEN (32767 - IDENT_CURRENT([Table].TABLE_NAME))
WHEN ''int''
THEN (2147483647 - IDENT_CURRENT([Table].TABLE_NAME))
WHEN ''bigint''
THEN (9223372036854775807 - IDENT_CURRENT([Table].TABLE_NAME))
WHEN ''decimal''
THEN ((([Column].NUMERIC_PRECISION * 10) - 1) - IDENT_CURRENT([Table].TABLE_NAME))
END
AS MONEY) , 1), ''.00'', '''') AS Remaining
FROM
INFORMATION_SCHEMA.COLUMNS AS [Column]
INNER JOIN
INFORMATION_SCHEMA.TABLES AS [Table]
ON [Table].TABLE_NAME = [Column].TABLE_NAME
WHERE
COLUMNPROPERTY(
OBJECT_ID([Column].TABLE_NAME),
[Column].COLUMN_NAME, ''IsIdentity'') = 1 --true
AND [Table].TABLE_TYPE = ''Base Table''
AND [Table].TABLE_NAME NOT LIKE ''dt%''
AND [Table].TABLE_NAME NOT LIKE ''MS%''
AND [Table].TABLE_NAME NOT LIKE ''syncobj_%''
AND CAST(
(
CASE LOWER([Column].DATA_TYPE)
WHEN ''tinyint''
THEN (IDENT_CURRENT([Table].TABLE_NAME)/255)
WHEN ''smallint''
THEN (IDENT_CURRENT([Table].TABLE_NAME)/32767)
WHEN ''int''
THEN (IDENT_CURRENT([Table].TABLE_NAME)/2147483647)
WHEN ''bigint''
THEN (IDENT_CURRENT([Table].TABLE_NAME)/9223372036854775807)
WHEN ''decimal''
THEN (IDENT_CURRENT([Table].TABLE_NAME)/(([Column].NUMERIC_PRECISION * 10) - 1))
END * 100
) AS INT) >= ' + CAST(@PercentFull AS VARCHAR(4))
IF (@Type IS NOT NULL)
SET @Sql = @Sql + 'AND LOWER([Column].DATA_TYPE) = ''' + LOWER(@Type) + ''''
SET @Sql = @Sql + '
ORDER BY
[Column].TABLE_CATALOG + ''.'' +
[Column].TABLE_SCHEMA + ''.'' +
[Table].TABLE_NAME,
[Column].COLUMN_NAME'
EXECUTE sp_executesql @Sql
GO
[aquí] (http://meta.stackexchange.com/questions/17463/can-i-answer-my-own-questions-even-those-where-i-knew-the-answer- antes de preguntar) y [aquí] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/) es por qué. Según las preguntas frecuentes de SO, este comportamiento no solo es aceptable, sino que se fomenta. Continuaré haciéndolo hasta que la comunidad de SO lo considere una mala etiqueta. –
Esta no es una respuesta, pero ¿ha comenzado sus identidades desde 0 o 1? En caso afirmativo, en lugar de aumentar el tamaño de la columna, ¿ha considerado restablecer la identidad a la int más pequeña? Eso le daría 2 mil millones adicionales del mismo tamaño de columna. –
@AlexKuznetsov: Sí, lo he considerado. Puedo usar valores negativos en proyectos futuros, pero hay tanto código escrito para esta base de datos que no quiero arriesgarme a romperlo. –