Tôi đã tạo một quy trình được lưu trữ để giải quyết vấn đề này. Nó sử dụng INFORMATION_SCHEMA
để tìm các cột IDENTITY
và sau đó sử dụng IDENT_CURRENT
và cột của DATA_TYPE
để tính phần trăm đầy đủ. Chỉ định cơ sở dữ liệu làm tham số đầu tiên, và sau đó tùy chọn phần trăm tối thiểu và kiểu dữ liệu.
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
Ví dụ đầu ra:
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
Tôi tạo ra một lời nhắc nhở để kiểm tra tất cả các cơ sở dữ liệu của tôi một lần mỗi tháng, và tôi đăng thông tin này trong một bảng tính.
CheckIdentityColumns Thủ tục
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
[Ở đây] (http://meta.stackexchange.com/questions/17463/can-i-answer-my-own-questions-even-those-where-i-knew-the-answer- trước khi yêu cầu) và [ở đây] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/) là lý do tại sao. Theo SO Hỏi đáp, hành vi này không chỉ chấp nhận được, nhưng nó được khuyến khích. Tôi sẽ tiếp tục làm điều đó cho đến khi nó được coi là nghi thức xấu bởi cộng đồng SO. –
Đây không phải là câu trả lời, nhưng bạn đã bắt đầu nhận dạng của mình từ 0 hay 1 chưa? Nếu có, thì thay vì tăng kích thước cột, bạn có xem xét đặt lại danh tính thành int nhỏ nhất không? Điều đó sẽ cung cấp cho bạn thêm 2 tỷ trong cùng một kích thước cột. –
@AlexKuznetsov: Vâng, tôi đã cân nhắc điều đó. Tôi có thể sử dụng các giá trị âm trong các dự án tương lai, nhưng có quá nhiều mã được viết cho cơ sở dữ liệu này mà tôi không muốn mạo hiểm phá vỡ nó. –