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' 
ScottStonehouse
quelle
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
Micah
quelle
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
StingyJack
quelle
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
Vikash Singh
quelle
11
SELECT * FROM information_schema.tables
where TABLE_TYPE = 'BASE TABLE'

SQL Server 2012

Rasoul Zabihi
quelle
9
exec sp_msforeachtable 'print ''?'''
Strahl
quelle
9
SELECT name 
FROM sysobjects 
WHERE xtype='U' 
ORDER BY name;

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

devio
quelle
7

select * from sysobjects where xtype='U'

Spoulson
quelle
6
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U' 
Erikk Ross
quelle
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
Astrotrain
quelle
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.
Scott Software
quelle
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
Vikash
quelle
1
SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE='BASE TABLE' 
ORDER BY TABLE_NAME
Entwickler
quelle
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 
Frank
quelle
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
DarkRob
quelle
0
--for oracle
select tablespace_name, table_name from all_tables;

Dieser Link kann viel mehr Informationen zu diesem Thema enthalten

Demietra95
quelle
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.

Masoud Darvishian
quelle