我正在尝试为我的每个表获取最大值 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
这个脚本检索错误的数据,但我觉得我有点关闭以获取值,但我不确定我做错了什么。 有人能给我任何好的方法吗?还是有任何更好的选择来完成它?
答案 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)