Ricevi tutti i nomi delle tabelle di un determinato database tramite query SQL?


304

Sto lavorando su un'applicazione in grado di gestire più server di database come "MySQL" e "MS SQL Server".

Voglio ottenere i nomi delle tabelle di un determinato database usando una query generale che dovrebbe essere adatta a tutti i tipi di database. Ho provato a seguire:

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

Ma fornisce i nomi delle tabelle di tutti i database di un determinato server, ma voglio ottenere solo i nomi delle tabelle del database selezionato. Come posso limitare questa query per ottenere tabelle di un determinato database?


1
Per Mysql puoi fare semplice. MOSTRA TAVOLI;
Ashish Gupta,

Risposte:


500

Probabilmente a causa del modo in cui i diversi dbms sql gestiscono gli schemi.

Prova quanto segue

Per SQL Server:

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

Per MySQL:

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

Per Oracle penso che sarebbe l'equivalente da usare DBA_TABLES.


3
Preferisco questa soluzione quando ho diversi schemi di tabella all'interno di un database (SQL Server): SELEZIONA CONCAT (TABLE_SCHEMA, '.', TABLE_NAME) DA INFORMATION_SCHEMA.TABLES DOVE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG = 'MyDB'
Verena Haunschmid

3
Uno deve usare quel particolare DB per ottenere le informazioni. USE dbName GOper SQL Server. Se non si utilizza il DB , il risultato non verrà visualizzato, anche se ci sono tabelle in quel DB.
barnes,

2
Per Mysql puoi fare semplice. MOSTRA TAVOLI;
Ashish Gupta,

La voce di SQL Server funziona bene per me senza il USE dbName GOprefisso su Server 2014.
Mmm

1) Hai suggerito la stessa cosa per un SQL Server e MySQL 2) INFORMATION_SCHEMA.TABLES esiste solo in MySQL 3) Mi chiedo davvero come mai hai ottenuto così tanti voti per questo ...
Apostolos,

82

Rubato da qui :

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO

3
Molto probabilmente SELEZIONA Nome DA sys.Tables dove is_ms_shipped = 0
om471987

1
questo è specifico del provider di database e non compatibile con ANSI SQL.
cjb110,

1
In alternativa, SELEZIONA * DA yourdbname.sys.Tables; se preferisci essere più conciso. Funziona in SQL Server, almeno.
Buckminst

29

La seguente query selezionerà tutto Tablesnel database denominato DBName:

USE DBName
GO 
SELECT *
FROM sys.Tables
GO

NO è solo un separatore parziale. puoi passare ad altro. Non è una sintassi T-SQL.
anishMarokey,

1
USA DatabaseSample SELEZIONA * FROM sys.Tables
Hamzeh Soboh

17
USE DBName;
SELECT * FROM sys.Tables;

Possiamo fare a meno che GOal posto di te sia possibile utilizzare il punto e virgola ;.


3
Per SQL Server su Azure, questo ha funzionato per me, ma la risposta accettata no. Grazie.
Giona il

14

Metti il DATABASE NAMEdavanti a INFORMATION_SCHEMA.TABLES:

select table_name from YOUR_DATABASE.INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE'

10

In mysql, utilizzare:

SHOW TABLES;

Dopo aver selezionato il DB con:

USE db_name

Osm ,,, swt n short
Deepa MG

Questo è MySQL, la domanda è taggata con il server MSSQL
Melle,

@Melle Guarda la descrizione della domanda
Lorenzo Lerate,

Questa non è la risposta migliore, vedi il mio commento sotto la risposta accettata (e corretta).
Chiwda,

6

Non ho visto questa risposta ma hey questo è quello che faccio:

SELECT name FROM databaseName.sys.Tables;


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

Qualche possibilità che potresti approfondire su cosa intendi con questo? Forse spiegarlo?
Alex K,

1
Exec sp_MSforeachtable 'Select ''?'''

Ciao Amirreza, credo tu stia parlando sp_MSforeachtable?
bummi,

@bummi: sì, grazie per l'attenzione e scusa per l'errore di battitura. Edited
Amir Keshavarz

1
USE dbName;

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

Se stai lavorando con più schemi su un server MS SQL, SELEZIONARE TABLE_NAME senza anche selezionare contemporaneamente TABLE_SCHEMA potrebbe essere di beneficio limitato, quindi ho assunto che siamo interessati alle tabelle appartenenti a uno schema noto quando si utilizza MS SQL Server.

Ho testato la query sopra con SQL Server Management Studio utilizzando un mio database SQL Server e con MySQL Workbench utilizzando un database MySQL, e in entrambi i casi fornisce i nomi delle tabelle.

La query unisce le due diverse query di Michael Baylon in una che può quindi essere eseguita su entrambi i tipi di database. La prima parte della clausola WHERE funziona su database MySQL e la seconda parte (dopo OR) su database MS SQL Server. È brutto e logicamente un po 'errato in quanto suppone che non ci sia uno schema indesiderato con lo stesso nome del database. Questo potrebbe aiutare qualcuno che sta cercando una singola query che può essere eseguita su entrambi i server di database.


1

AGGIORNAMENTO PER L'ULTIMA VERSIONE DEL SERVER MSSQL (17.7)

SELECT name FROM sys.Tables WHERE type_desc = 'USER_TABLE'

O SELECT *per ottenere tutte le colonne.


Mi sono appena reso conto che questa query dà risultati errati per i caratteri non inglesi nel nome della tabella, mentre quelli di Michael Baylon danno risultati corretti. (il personaggio era in minuscolo in lingua turca "ı")
onur demir il

1

Per selezionare la query del database di seguito:

use DatabaseName

Adesso

SELECT * FROM INFORMATION_SCHEMA.TABLES

Ora puoi vedere le tabelle create di seguito nella console.

PFA.

domanda


0

Sì, l'oracolo è:

select * from user_tables

Cioè se si desidera solo oggetti di proprietà dell'accesso, user/schemaaltrimenti è possibile utilizzare all_tableso dba_tablesche include tabelle di sistema.


stanno cercando query tra provider non specifiche del provider.
cjb110,

Non esiste un modo coerente per farlo da sql poiché tutti i motori di database implementano il dizionario dei dati in modo diverso. Potrebbe essere possibile astrarre questo usando jdbc / odbc e un linguaggio 3GL come C / Java / C # se questo è un requisito programmatico, sicuramente possibile se si dispone di un'implementazione diversa per ciascun database. L'operazione dovrebbe chiarire i loro requisiti ...
kayakpim,

0

Basandomi sulla risposta di Michael Baylon, avevo bisogno di un elenco che includesse anche le informazioni sullo schema ed è così che ho modificato la sua query.

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

Nel nostro Oracle DB (PL / SQL) sotto il codice funziona per ottenere l'elenco di tutte le tabelle esistenti nel nostro DB.

select * from tab;

e

select table_name from tabs;

entrambi stanno funzionando. proviamo a trovare il tuo.


0

Basta ottenere tutte le informazioni improtanat con questo sotto SQL in Mysql

    SELECT t.TABLE_NAME , t.ENGINE , t.TABLE_ROWS ,t.AVG_ROW_LENGTH, 
t.INDEX_LENGTH FROM 
INFORMATION_SCHEMA.TABLES as t where t.TABLE_SCHEMA = 'YOURTABLENAMEHERE' 
order by t.TABLE_NAME ASC limit 10000;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.