2010-10-12 11 views
204

Ich arbeite an einer Anwendung, die mit mehreren Datenbankservern wie "MySQL" und "MS SQL Server" umgehen kann.Erhalten Sie alle Tabellennamen einer bestimmten Datenbank per SQL-Abfrage?

Ich möchte Tabellen Namen einer bestimmten Datenbank mit einer allgemeinen Abfrage erhalten, die für alle Datenbanktypen geeignet sein sollte. Ich habe folgende versucht:

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

Aber es ist zu geben Tabellennamen aller Datenbanken eines bestimmten Servers, aber ich möchte nur Tabellen Namen der ausgewählten Datenbank erhalten. Wie kann ich diese Abfrage einschränken, um Tabellen einer bestimmten Datenbank abzurufen?

+0

Für Mysql können Sie einfach tun. Schautafeln; –

Antwort

330

wahrscheinlich aufgrund der Art und Weise verschiedene SQL-dbms handeln von Schemata.

Versuchen Sie, die folgende

Für SQL Server:

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG='dbName' 

Für MySQL:

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA='dbName' 

Für Oracle denke ich, das Äquivalent DBA_TABLES zu verwenden wäre.

+1

Ich ziehe es diese Lösung, wenn ich andere Tabelle Schemata innerhalb einer Datenbank (SQL Server) haben: SELECT CONCAT (TABLE_SCHEMA, TABLE_NAME ' ') VON INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG =' MyDB' –

+1

Man muss diese spezielle ** DB ** verwenden, um die Informationen zu erhalten. 'USE dbName GO' für SQL-Server. Wenn Sie nicht die ** DB ** verwenden, wird das Ergebnis nicht angezeigt, auch wenn in dieser DB Tabellen vorhanden sind. – barnes

+0

Für Mysql können Sie einfach tun. Schautafeln; –

20

Die folgende Abfrage wird alle der Tables in der Datenbank auswählen DBName genannt:

USE DBName 
GO 
SELECT * 
FROM sys.Tables 
GO 
+0

'Go' ist Teil der Abfrage ?? – Awan

+0

NEIN es nur Teiletrenner. Sie können zu anderen ändern. Dies ist keine T-SQL-Syntax. – anishMarokey

+1

USE DatabaseSample SELECT * FROM sys.tables –

66

Stolen aus here:

USE YOURDBNAME 
GO 
SELECT * 
FROM sys.Tables 
GO 
+3

wahrscheinlich Namen von sys.tables meisten SELECT wo is_ms_shipped = 0 – om471987

+1

diese Datenbankanbieter spezifisch ist, und nicht die ANSI SQL-kompatibel. – cjb110

+0

Alternativ SELECT * FROM yourdbname.sys.Tables; wenn Sie es vorziehen, prägnanter zu sein. Funktioniert mindestens in SQL Server. – buckminst

0

Ja Orakel:

select * from user_tables 

Das heißt, wenn Sie nur Objekte, die von der in user/schema angemeldet Besitz möchten sonst können Sie all_tables oder dba_tables verwenden, die Systemtabellen enthält.

+0

suchen sie nach Provider-Query-Anfragen, die nicht providerspezifisch sind. – cjb110

+0

Es gibt keine konsistente Möglichkeit, dies von SQL aus zu tun, da alle Db-Engines das Data Dictionary unterschiedlich implementieren. Es könnte möglich sein, dies mit jdbc/odbc und einer 3GL-Sprache wie C/Java/C# zu abstrahieren, wenn dies eine programmatische Anforderung ist, was definitiv möglich ist, wenn Sie für jede Datenbank eine andere Implementierung haben. Die Op sollte ihre Anforderungen klarstellen ... – kayakpim

13

Einfach den DATABASE NAME vor INFORMATION_SCHEMA.TABLES:

select table_name from YOUR_DATABASE.INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE' 
12
USE DBName; 
SELECT * FROM sys.Tables; 

Wir ohne GO an Ort und Stelle umgehen können von Ihnen Semikolon ; verwenden können.

+2

Für SQL Server auf Azure, funktionierte das für mich, aber die akzeptierte Antwort nicht. Vielen Dank. – Jonah

1
Exec sp_MSforeachtable 'Select ''?''' 
+0

Hallo Amirreza, ich glaube du sprichst von 'sp_MSforeachtable'? – bummi

+0

@bummi: Ja großartig, danke für die Aufmerksamkeit und Entschuldigung für Tippfehler. Bearbeitet –

1
select * from sys.tables 
order by schema_id  --comments: order by 'schema_id' to get the 'tables' in 'object explorer order' 
go 
+0

Gibt es eine Chance, dass Sie ein wenig darüber nachdenken könnten, was Sie damit meinen? Vielleicht erklären Sie es? –

6

In mysql, Verwendung:

SHOW TABLES; 

Nach dem DB Auswahl mit:

USE db_name 
0

Gebäude von Michael Baylon Antwort, habe ich eine Liste benötigt, die auch Schemainformationen enthalten und so habe ich seine Abfrage modifiziert.

SELECT TABLE_SCHEMA + '.' + TABLE_NAME as 'Schema.Table' 
    FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG = 'dbName' 
    ORDER BY TABLE_SCHEMA, TABLE_NAME 
0
USE dbName; 

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE (TABLE_SCHEMA = 'dbName' OR TABLE_SCHEMA = 'schemaName') 
ORDER BY TABLE_NAME 

Wenn Sie mit mehreren Schemata auf einem MS SQL Server arbeiten, dann SELECT-ing TABLE_NAME ohne auch TABLE_SCHEMA gleichzeitig die Auswahl könnte von begrenztem Nutzen sein, so dass ich davon ausgegangen, wir sind in den Tabellen interessiert gehören, zu einem bekannten Schema bei Verwendung von MS SQL Server.

Ich habe die obige Abfrage mit SQL Server Management Studio unter Verwendung einer SQL Server-Datenbank von mir und mit MySQL Workbench unter Verwendung einer MySQL-Datenbank getestet, und in beiden Fällen gibt es die Tabellennamen.

Die Abfrage bodges Michael Baylon zwei unterschiedliche Abfragen in eine, die auf beiden Datenbanktypen dann ausgeführt werden kann. Der erste Teil der WHERE-Klausel funktioniert auf MySQL-Datenbanken und der zweite Teil (nach dem OR) funktioniert auf MS SQL Server-Datenbanken. Es ist hässlich und logisch ein wenig falsch, da angenommen wird, dass es kein unerwünschtes Schema mit dem gleichen Namen wie die Datenbank gibt. Dies könnte jemandem helfen, der nach einer einzelnen Abfrage sucht, die auf beiden Datenbankservern ausgeführt werden kann.

2

Für Mysql können Sie einfach tun. Schautafeln;

6

Ich habe nicht diese Antwort sehen, aber hey das ist, was ich tue:

SELECT name FROM databaseName.sys.Tables; 
Verwandte Themen