2016-07-27 3 views
0

Я пытаюсь получить максимальное значение MAX (ID) для каждой таблицы у меня есть, который содержит идентификатор на моей БД «Table_Example» и один имя_схемы в частности.Max (ID) каждой таблицы в базе данных

Один пример:

SELECT MAX(ID) FROM Schema_name.Table_name1 

Это получить максимальное значение идентификатора, который расположен на Table_name1, но у меня есть 84 таблицы. Я хотел бы знать максимум каждой таблицы только в одном столбце. Это код, где я сейчас работаю: Я использую information_schema.columns, чтобы получить имена таблиц автоматически и схему, к которой принадлежит каждая таблица, чтобы получить все идентификаторы базы данных 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

Вы просто пытаетесь получить максимальное значение столбца identity/index в каждой из ваших таблиц? –

+2

@JohnPasquet, и все же вам удалось опубликовать ответ. Дайте ОП некоторое время. Не все все время на SO –

ответ

1

Это Перечислять все таблицы с Идентификатор столбца и значение MAX этого ID:

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) и Max 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

Если вы хотите получить максимальное значение в своих столбцах идентификации, независимо от имен этих столбцов, то это очень простой способ сделать это. Это даст вам Table Name, имя идентичности столбца, а максимальное значение этого столбца:

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

Этот скрипт выведет список всех макс идентификаторами. Предполагается, что ваш первый столбец - это идентификатор, независимо от его имени.

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) 
Смежные вопросы