数据库上每个表的最大值(ID)

时间:2016-07-27 13:23:03

标签: sql sql-server tsql

我正在尝试为我的每个表获取最大值 MAX(ID),其中包含我的数据库“Table_Example”上的ID和特定的一个schema_name。 / p>

一个例子:

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

这个脚本检索错误的数据,但我觉得我有点关闭以获取值,但我不确定我做错了什么。 有人能给我任何好的方法吗?还是有任何更好的选择来完成它?

6 个答案:

答案 0 :(得分:3)

如果您想要标识列中的最大值,无论这些列的名称如何,那么这是一种非常简单的方法。这将为您提供表名,标识列的名称以及该列的最大值:

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

答案 1 :(得分:2)

此枚举所有具有此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);

答案 2 :(得分: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')

答案 3 :(得分:0)

也许是一点点动态SQL

  

编辑这将在一个数据集中返回表名称和最大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)

答案 4 :(得分: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

答案 5 :(得分: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)