2010-10-12 12 views
204

Sto lavorando su un'applicazione che può gestire più server di database come "MySQL" e "MS SQL Server".Ottieni tutti i nomi tabella di un determinato database tramite query SQL?

Desidero ottenere i nomi delle tabelle di un determinato database utilizzando una query generale che dovrebbe essere adatta a tutti i tipi di database. Ho provato seguente:

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

ma è dare nomi delle tabelle di tutti i database di un determinato server, ma voglio ottenere tavoli nomi di solo database selezionato. Come posso limitare questa query per ottenere tabelle di un particolare database?

+0

per MySQL si può fare semplice. SHOW TABLES; –

risposta

330

Probabilmente a causa del diverso modo DBMS SQL accordo con schemi.

provare il seguente

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 l'equivalente sarebbe quella di utilizzare DBA_TABLES.

+1

preferisco questa soluzione quando ho tavolo diverso schemi all'interno di un database (SQL Server): SELEZIONE CONCAT (TABLE_SCHEMA,, TABLE_NAME ' ') FROM WHERE INFORMATION_SCHEMA.TABLES TABLE_TYPE = 'BASE table' e TABLE_CATALOG =' MyDB' –

+1

Uno deve utilizzare quel particolare ** DB ** per ottenere le informazioni. 'USE dbName GO' per SQL-Server. Se non stai utilizzando il ** DB **, il risultato non verrà visualizzato, anche se ci sono tabelle in quel DB. – barnes

+0

Per Mysql puoi fare cose semplici. SHOW TABLES; –

20

La seguente query selezionerà tutto il Tables nel database denominato DBName:

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

"Vai" è parte della query ?? – Awan

+0

NO solo parte separatore. puoi passare ad altro.Il suo non è una sintassi T-SQL. – anishMarokey

+1

USE DatabaseSample SELECT * FROM sys.Tables –

66

rubato da here:

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

Molto probabilmente SELECT Nome FROM sys.Tables dove is_ms_shipped = 0 – om471987

+1

questo è specifico del provider di database e non compatibile ANSI SQL. – cjb110

+0

In alternativa, SELECT * FROM yourdbname.sys.Tables; se preferisci essere più conciso. Funziona in SQL Server, almeno. – buckminst

0

Sì oracolo è:

select * from user_tables 

Cioè se desideri solo gli oggetti di proprietà del loggato user/schema altrimenti è possibile utilizzare all_tables o dba_tables che include le tabelle di sistema.

+0

stanno cercando query cross provider non specifiche del provider. – cjb110

+0

Non esiste un metodo coerente per eseguire questa operazione da sql poiché tutti i motori db implementano il dizionario 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 differente per ogni database. L'op dovrebbe chiarire i loro requisiti ... – kayakpim

13

appena messo il DATABASE NAME davanti INFORMATION_SCHEMA.TABLES:

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

possiamo affrontare senza GO sul posto di è possibile utilizzare il punto e virgola ;.

+2

Per SQL Server su Azure, questo ha funzionato per me, ma la risposta accettata no. Grazie. – Jonah

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

Ciao Amirreza, credo che tu stia parlando di 'sp_MSforeachtable'? – bummi

+0

@bummi: sì grandioso, grazie per l'attenzione e scusa per l'errore di battitura. Modificato –

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

Qualche possibilità di elaborare un po 'su cosa intendi con questo? Forse lo spieghi? –

6

in MySQL, uso:

SHOW TABLES; 

Dopo aver selezionato il DB con:

USE db_name 
0

costruzione dalla risposta di Michael Baylon, avevo bisogno di una lista che comprende 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
USE dbName; 

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

Se si lavora con schemi multipla su un server MS SQL, quindi selezionare-ing TABLE_NAME anche senza selezionare contemporaneamente TABLE_SCHEMA potrebbe essere di beneficio limitato, quindi ho assunto che sono interessati nelle tabelle appartenenti a uno schema noto quando si utilizza MS SQL Server.

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

La query riunisce due query diverse 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 l'OR) funziona su database MS SQL Server. È brutto e logicamente un po 'scorretto 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 un server database.

2

Per Mysql puoi fare semplice. TAVOLI DI SPETTACOLO;

6

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

SELECT name FROM databaseName.sys.Tables; 
Problemi correlati