Wie erhalte ich mit TSQL eine Liste aller Tabellen in einer Datenbank?


Antworten:


1429

SQL Server 2000, 2005, 2008, 2012, 2014, 2016, 2017 oder 2019:

SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'

Nur Tabellen aus einer bestimmten Datenbank anzeigen

SELECT TABLE_NAME 
FROM <DATABASE_NAME>.INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE = 'BASE TABLE'

Oder,

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE = 'BASE TABLE' 
    AND TABLE_CATALOG='dbName' --(for MySql, use: TABLE_SCHEMA='dbName' )

PS: Für SQL Server 2000:

SELECT * FROM sysobjects WHERE xtype='U' 

46
Bitte beachten Sie, dass dies auch ANSICHTEN beinhaltet, nicht nur Tabellen
Nathan Koop

17
Fügen Sie den Datenbanknamen hinzu, wenn Sie die spezifische Datenbank nicht verwenden, sodass er SELECT TABLE_NAME FROM <DATABASE_NAME> .INFORMATION_SCHEMA.Tables
Shriroop

22
Das Hinzufügen WHERE TABLE_TYPE='BASE TABLE'umfasst nur Basistabellen (und als Erweiterung können Sie diese immer verwenden WHERE TABLE_TYPE != 'VIEW').
Phillip Copley

3
"sysdiagrams" erscheint auch in dieser Liste :(
celsowm

4
sysdiagrams ist eine normale Tabelle, die Sie immer manuell mit a ausschließen müssen AND name <> 'sysdiagrams'.
Christoph

199
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U'

Hier ist eine Liste anderer Objekttypen, nach denen Sie ebenfalls suchen können:

  • AF: Aggregatfunktion (CLR)
  • C: CHECK-Einschränkung
  • D: Standard- oder STANDARD-Einschränkung
  • F: FOREIGN KEY-Einschränkung
  • L: Protokoll
  • FN: Skalarfunktion
  • FS: CLR-Skalarfunktion (Assembly)
  • FT: Tabellenwertfunktion für Assembly (CLR)
  • IF: Inline-Tabellenfunktion
  • IT: Interne Tabelle
  • P: Gespeicherte Prozedur
  • PC: Assembly (CLR) gespeicherte Prozedur
  • PK: PRIMARY KEY-Einschränkung (Typ ist K)
  • RF: Gespeicherte Prozedur des Replikationsfilters
  • S: Systemtabelle
  • SN: Synonym
  • SQ: Servicewarteschlange
  • TA: Assembly (CLR) DML-Trigger
  • TF: Tabellenfunktion
  • TR: SQL DML-Trigger
  • TT: Tabellentyp
  • U: Benutzertabelle
  • UQ: EINZIGARTIGE Einschränkung (Typ ist K)
  • V: Anzeigen
  • X: Erweiterte gespeicherte Prozedur

9
Das Aliasing ist etwas überflüssig: SELECT name FROM sysobjects WHERE xtype = 'U'würde das gleiche tun.
PJSCopeland

Danke, anfangs habe ich dies mit mehreren select-Anweisungen für PK,FK,D,C,V,UQetc versucht , um die Quell- und Zieldatenbank zu vergleichen, aber dann habe ich diese Funktion in VS gefunden, aber gibt es keine sql query, um die vollständige Quell- und Zieldatenbank zu vergleichen?
Shaijut

Man fragt sich, warum 'U'die Benutzertabelle verwendet wird ... im Gegensatz zu vielleicht 'UT'oder, am intuitivsten, 'T'... Ah, das funktioniert!
user919426

87
SELECT * FROM INFORMATION_SCHEMA.TABLES 

ODER

SELECT * FROM Sys.Tables

5
Nur ein Hinweis, dass (wie in anderen Antworten erwähnt) sys.tables erst ab 2005 verfügbar ist
Rob

2
Was 2018 kein Problem ist. Ich denke, das sollte höher sein :-)
Michal B.

29
USE YourDBName
GO 
SELECT *
FROM sys.Tables
GO

ODER

USE YourDBName
GO
SELECT * FROM INFORMATION_SCHEMA.TABLES 
GO

11
SELECT * FROM information_schema.tables
where TABLE_TYPE = 'BASE TABLE'

SQL Server 2012



9
SELECT name 
FROM sysobjects 
WHERE xtype='U' 
ORDER BY name;

(SQL Server 2000-Standard; wird in SQL Server 2005 weiterhin unterstützt.)



6
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U' 

SELECT name FROM sysobjects WHERE xtype='U' AND name <> 'sysdiagrams'; da die von Microsoft SQL Server Management Studio erstellte Sysdiagrams-Tabelle technisch gesehen keine Systemtabelle ist, sondern eine, die wir normalerweise trotzdem ausschließen möchten.
Christoph

5

Der Nachteil von INFORMATION_SCHEMA.TABLESist, dass es auch Systemtabellen wie dtpropertiesund die MSpeer_...Tabellen enthält, ohne dass Sie sie von Ihren eigenen Tabellen unterscheiden können.

Ich würde empfehlen, sys.objects(die neue Version der veralteten Sysobjects- Ansicht) zu verwenden, die das Ausschließen der Systemtabellen unterstützt:

select *
from sys.objects
where type = 'U'      -- User tables
and is_ms_shipped = 0 -- Exclude system tables

2

So rufen Sie in SSMS alle vollständig qualifizierten Tabellennamen in einer bestimmten Datenbank ab (z. B. "MyDatabase"):

SELECT [TABLE_CATALOG] + '.' + [TABLE_SCHEMA] + '.' + [TABLE_NAME]
FROM   MyDatabase.INFORMATION_SCHEMA.Tables
WHERE  [TABLE_TYPE] = 'BASE TABLE' and [TABLE_NAME] <> 'sysdiagrams'
ORDER BY [TABLE_SCHEMA], [TABLE_NAME]

Ergebnisse:

  • MyDatabase.dbo.MyTable1
  • MyDatabase.dbo.MyTable2
  • MyDatabase.MySchema.MyTable3
  • MyDatabase.MySchema.MyTable4
  • usw.

2

Bitte benutzen Sie dies. Sie erhalten Tabellennamen zusammen mit Schemanamen:

SELECT SYSSCHEMA.NAME, SYSTABLE.NAME
FROM SYS.tables SYSTABLE
INNER JOIN SYS.SCHEMAS SYSSCHEMA
ON SYSTABLE.SCHEMA_ID = SYSSCHEMA.SCHEMA_ID

1
SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE='BASE TABLE' 
ORDER BY TABLE_NAME

1

Vielen Dank an Ray Vega, dessen Antwort alle Benutzertabellen in einer Datenbank enthält ...

exec sp_msforeachtable 'print' '?' ''

sp_helptext zeigt die zugrunde liegende Abfrage, die zu ...

select * from dbo.sysobjects o 
join sys.all_objects syso on o.id =  syso.object_id  
where OBJECTPROPERTY(o.id, 'IsUserTable') = 1 
and o.category & 2 = 0 

1

Nun, Sie können sys.objects verwenden , um alle Datenbankobjekte abzurufen .

 GO
 select * from sys.objects where type_desc='USER_TABLE' order by name
 GO

ODER

--  For all tables
select * from INFORMATION_SCHEMA.TABLES 
GO 

  --- For user defined tables
select * from INFORMATION_SCHEMA.TABLES where TABLE_TYPE='BASE TABLE'
GO

  --- For Views
select * from INFORMATION_SCHEMA.TABLES where TABLE_TYPE='VIEW'
GO

0
--for oracle
select tablespace_name, table_name from all_tables;

Dieser Link kann viel mehr Informationen zu diesem Thema enthalten


2
Dies ist nicht für SQL Server, daher keine Antwort auf diese Frage.
Dan Getz

0

Die Verwendung SELECT * FROM INFORMATION_SCHEMA.COLUMNSzeigt Ihnen auch alle Tabellen und zugehörigen Spalten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.