对于给定数据库中的所有表,使用单个选择查询,我需要获取标识列的最小值和最大值以及下面查询中指定的其他列。
这是我能够编写代码以获取表及其标识列的列表:
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.
答案 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的意见,因为这个值很少用,因为在繁忙的系统中,一旦查询执行,它肯定会立即(或之后不久)出错。