使用单选查询获取数据库中所有表的标识列的最小值,最大值

时间:2014-08-27 18:21:17

标签: sql-server tsql

对于给定数据库中的所有表,使用单个选择查询,我需要获取标识列的最小值和最大值以及下面查询中指定的其他列。

这是我能够编写代码以获取表及其标识列的列表:

Select so.name as TableName
,      sic.name as ColumnName
,      i.Rows Count_NumberOfRecords
,      IDENT_CURRENT(so.name)+IDENT_INCR(so.name) as NextSeedValue
from       sys.identity_columns sic
inner join sys.objects          so  on sic.object_id = so.object_id
inner join sys.sysindexes       I   ON So.OBJECT_ID = I.ID
Where so.type_desc = 'USER_TABLE' and last_value is not null and indid IN (0,1);

查询需要获取这些额外的列:

MaximumValue (IdentityColumn) and MinimumValue (IdentityColumn) for each table.

1 个答案:

答案 0 :(得分:3)

您应该可以使用以下内容:

DECLARE @cmd NVARCHAR(max);
SET @cmd = '';

SELECT @cmd = @cmd + CASE WHEN (@cmd = '') THEN '' ELSE ' UNION ALL ' END + 'SELECT ''' + 
    QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ''' AS TableName, ''' + 
    QUOTENAME(c.name) + ''' AS ColumnName, MAX(' + QUOTENAME(c.name) + ') AS MaxID, MIN(' + 
    QUOTENAME(c.name) + ') AS MinID, COALESCE(IDENT_CURRENT(''' + QUOTENAME(s.name) + '.' + 
    QUOTENAME(t.name) + '''),0) + COALESCE(IDENT_INCR(''' + QUOTENAME(s.name) + '.' + 
    QUOTENAME(t.name) + '''),0) AS NextValue FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) 
FROM sys.tables t
    INNER JOIN sys.columns c ON t.object_id = c.object_id
    INNER JOIN sys.schemas s on t.schema_id = s.schema_id
WHERE c.is_identity = 1

SELECT @cmd; /* Shows the dynamic query generated, not necessary */

EXEC sp_executesql @cmd;

该查询使用动态SQL构建UNION查询,该查询收集当前每个具有IDENTITY字段的表中的表名,列名以及最小和最大ID值。

你可以很容易地修改它以显示你想要的格式的列,以及你在问题中提到的其他列。

我已经编辑了上面的查询以包含" NextValue"但是我同意@AaronBertrand的意见,因为这个值很少用,因为在繁忙的系统中,一旦查询执行,它肯定会立即(或之后不久)出错。