2016-07-27 18 views
0

Ich versuche, den Maximalwert MAX (ID) für jede Tabelle Ich habe die ID auf meiner DB enthält zu erhalten „Table_Example“ und einen schema_name in bestimmten.Max (ID) jede Tabelle in einer Datenbank

Ein einziges Beispiel:

SELECT MAX(ID) FROM Schema_name.Table_name1 

Das Abrufen der maximalen ID-Wert, der auf Table_name1 befindet, aber ich habe 84 Tabellen. Ich möchte das Maximum jeder Tabelle nur in einer Spalte wissen. Dies ist der Code, an dem ich gerade arbeite: Ich verwende information_schema.columns, um die Namen der Tabellen automatisch zu erhalten und das Schema, zu dem jede Tabelle gehört, um die gesamte DB IDs max (id) in einem zu erhalten Säule.

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 

Dieses Script abrufen falsche Daten, aber ich denke, ich bin ein bisschen um die Werte zu erhalten geschlossen, aber ich bin nicht sicher, was ich falsch mache. Kann mir jemand einen guten Ansatz geben? Oder eine bessere Option, um es zu erledigen?

+0

Ist der Spaltenname 'ID' in jeder Tabelle? –

+0

Versuchen Sie einfach, den Maximalwert der Spalte identity/index in jeder Ihrer Tabellen zu ermitteln? –

+2

@JohnPasquet und doch hast du es geschafft, eine Antwort zu posten. Gib OP etwas Zeit. Nicht jeder ist die ganze Zeit auf SO –

Antwort

1

Diese Aufzählung alle Tabellen mit Spalte ID und MAX-Wert dieser 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

wie diese versuchen,

Dies würde Ihnen das Skript.

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

Vielleicht ein wenig dynamischer SQL

bearbeitet Dies wird der Tabellenname zurückkehren (n) und Max-ID in einem Datensatz

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

Wenn Sie den Maximalwert in Ihren Identitätsspalten unabhängig von den Namen dieser Spalten wünschen, ist dies eine sehr einfache Methode. Dies gibt Ihnen den Tabellennamen, den Namen der Identitätsspalte, und den maximalen Wert dieser Spalte:

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

Dieses Skript listet allen max ids. Es wird davon ausgegangen, dass Ihre erste Spalte die ID ist, unabhängig von ihrem Namen.

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)