2016-07-27 62 views
0

我想获得最大值MAX (ID)为包含在我的DB “Table_Example”和特定的一个模式名ID的每个表我对每个表(ID)。最大数据库

单个例如:

SELECT MAX(ID) FROM Schema_name.Table_name1 

此检索位于Table_name1最大ID值,但是我有84个表。我想知道每个表的最大值只在一列中。 这是我目前正在使用的代码: 我正在使用information_schema.columns来自动获取表的名称以及每个表所属的模式,以便将整个DB ID max(id)合并为一个柱。

USE TABLE_EXAMPLE 
GO 
DECLARE @ID NVARCHAR(MAX) --int 

SET @ID = (SELECT DISTINCT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'SCHEMA_NAME' AND COLUMN_NAME IN ('ID') AND DATA_TYPE = 'INT') 

SELECT @ID FROM (SELECT ('SCHEMA_NAME'+'.'+TABLE_NAME) AS TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'SCHEMA_NAME' AND COLUMN_NAME = 'ID' AND DATA_TYPE='INT') AS W 

此脚本检索错误的数据,但我认为我是一个有点封闭,得到的值,但我不知道我做错了。 有人可以给我任何好的方法吗?或者有更好的选择来完成它?

+0

是否在每个表中列名称为“ID”? –

+0

你只是试图获得每个表中的标识/索引列的最大值? –

+2

@JohnPasquet,但你设法发布一个答案..给OP一些时间。并非所有人都在此时 –

回答

1

此枚举所有表与此ID的列ID和MAX值:

DECLARE @query nvarchar(MAX); 
SELECT @query = COALESCE(@query + char(10)+'UNION ALL '+char(10)+'SELECT '''+QUOTENAME(s.name)+'.'+QUOTENAME(T.name)+''' [Table], MAX(Id) [Max] FROM '+QUOTENAME(s.name)+'.'+QUOTENAME(T.name), 
'SELECT '''+QUOTENAME(s.name)+'.'+QUOTENAME(T.name)+''' [Table], MAX(Id) [Max] FROM '+QUOTENAME(s.name)+'.'+QUOTENAME(T.name)) 
FROM sys.schemas S 
JOIN sys.tables T ON S.schema_id=T.schema_id 
JOIN sys.columns C ON T.object_id=C.object_id 
WHERE C.name='Id'; 
EXEC(@query); 
0

像这样尝试,

这会给你脚本。

SELECT DISTINCT 'SELECT MAX(' + + COLUMN_NAME + ') as ' + table_name + 'MaxId FROM ' + table_name 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'dbo' 
    AND COLUMN_NAME IN ('ID') 
0

也许有点动态SQL

编辑这将返回表名(S)和最大ID在一个数据集

Declare @SQL varchar(max) = '>>>' 
Select @SQL = @SQL + SQL 
From (
     Select SQL='Union All Select TableName='''+concat('[',Table_Schema,'].[',Table_Name,']')+''',MaxID=max(ID) From '+concat('[',Table_Schema,'].[',Table_Name,'] ') 
      From INFORMATION_SCHEMA.COLUMNS 
      Where Column_Name = 'ID' 
    ) A 

Set @SQL=Replace(@SQL,'>>>Union All ','') 
Exec(@SQL) 
0

如果您想在身份列中使用最大值,而不考虑这些列的名称,那么这是一个非常简单的方法。这会给你的表名,标识列的名称,并且该列的最大值:

SELECT sys.tables.name AS [Table Name], 
    sys.identity_columns.name AS [Column Name], 
    last_value AS [Last Value]  
FROM sys.identity_columns 
    INNER JOIN sys.tables 
     ON sys.identity_columns.object_id = sys.tables.object_id 
ORDER BY last_value DESC 
0
CREATE TABLE #MaxValues (SchemaName SYSNAME , TableName SYSNAME , MaxID INT) 
GO 


Declare @SchemaName SYSNAME = 'dbo' --<-- Pass you schema name to this variable 
     ,@ColumnName SYSNAME = 'ID' --<-- Column Name 
     ,@DataType SYSNAME = 'INT' --<-- Data type 



DECLARE @TableName SYSNAME , @SchmaName SYSNAME 
     , @Sql NVARCHAR(MAX) , @ColName SYSNAME; 

Declare Cur CURSOR LOCAL FAST_FORWARD FOR 
SELECT s.name , t.name , c.name 
FROM sys.columns c 
Inner join sys.tables t on c.object_id = t.object_id 
Inner join sys.schemas s on s.schema_id = t.schema_id 
Inner join sys.types tp on tp.user_type_id = c.user_type_id 
WHERE s.name = @SchemaName 
AND c.name = @ColumnName 
AND tp.name = @DataType 

OPEN Cur 
    FETCH NEXT FROM Cur INTO @SchmaName , @TableName , @ColName 

WHILE (@@FETCH_STATUS =0) 
BEGIN 
    SET @Sql = N'INSERT INTO #MaxValues (SchemaName, TableName, MaxID)' 
      + N' SELECT @SchmaName ,@TableName, MAX(' + QUOTENAME(@ColName) + N') ' 
      + N' FROM ' + QUOTENAME(@SchmaName) + '.' + QUOTENAME(@TableName) 

    Exec sp_executesql @Sql 
         ,N'@SchmaName SYSNAME , @TableName SYSNAME' 
         ,@SchmaName 
         ,@TableName 
    FETCH NEXT FROM Cur INTO @SchmaName , @TableName , @ColName 
END 

CLOSE Cur 
DEALLOCATE Cur 

SELECT * FROM #MaxValues 
0

这个脚本会列出所有的最大的ID。假设你的第一列是ID,不管它的名字如何。

DECLARE @Script AS VARCHAR(MAX) = '' 

SELECT @Script = @Script + 'SELECT MAX(' + COLUMN_NAME + ') AS ID FROM ' + c.TABLE_NAME + ' UNION ALL ' + CHAR(13)+CHAR(10) 
FROM INFORMATION_SCHEMA.COLUMNS c 
INNER JOIN INFORMATION_SCHEMA.TABLES t ON c.TABLE_NAME = t.TABLE_NAME 
WHERE c.ORDINAL_POSITION = 1 and t.TABLE_TYPE = 'BASE TABLE' and c.TABLE_SCHEMA = 'dbo' and c.DATA_TYPE = 'int' 

SELECT @Script = LEFT(@Script, LEN(@Script) - 12) 

EXEC (@Script)