2014-08-27 52 views
-2

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

这是我已经能够代码来获取表和自己的身份列的列表:

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. 
+3

所以,你有什么问题?你能证明你到目前为止所尝试过的吗? – 2014-08-27 18:23:26

+0

'选择so.name如表名 \t,sic.name作为的ColumnName \t,i.Rows Count_NumberOfRecords \t,IDENT_CURRENT(so.name)+ IDENT_INCR作为NextSeedValue \t从sys.identity_columns SIC \t(so.name)内连接sys.objects so sic.object_id = so.object_id \t inner join sys.sysindexes I ON So.OBJECT_ID = I.ID \t where so.type_desc ='USER_TABLE'and last_value is not null and indid IN(0 ,1)' – Aditya 2014-08-27 18:25:58

+1

你还没有听说过聚合函数吗? – SSE 2014-08-27 18:26:50

回答

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的意思,这个值没什么用处,因为在繁忙的系统中,它肯定会立即出错(或之后不久)一旦查询执行。

+0

最大,有没有一种方式也没有使用动态SQL。 – Aditya 2014-08-27 18:47:52

+4

也许,但是为什么?这正确回答了问题,没有太多麻烦。此外,它不使用任何讨厌的游标或循环,并且完全基于集合,所以SQL Server应该能够提出一个很好的计划。 – 2014-08-27 18:51:14

+0

我注意到你标记为答案,然后将其标记为未标记。答案有问题吗? – 2014-08-27 19:19:01

相关问题