Obtenir tous les noms de table d'une base de données particulière par requête SQL?


304

Je travaille sur une application qui peut gérer plusieurs serveurs de bases de données comme "MySQL" et "MS SQL Server".

Je veux obtenir les noms des tables d'une base de données particulière en utilisant une requête générale qui devrait convenir à tous les types de base de données. J'ai essayé de suivre:

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

Mais il donne les noms de table de toutes les bases de données d'un serveur particulier, mais je veux obtenir les noms de tables de la base de données sélectionnée uniquement. Comment puis-je restreindre cette requête pour obtenir des tables d'une base de données particulière?


1
Pour Mysql, vous pouvez faire simple. AFFICHER LES TABLES;
Ashish Gupta

Réponses:


500

Probablement en raison de la manière dont différents dbms sql traitent les schémas.

Essayez ce qui suit

Pour SQL Server:

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

Pour MySQL:

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

Pour Oracle, je pense que l'équivalent serait d'utiliser DBA_TABLES.


3
Je préfère cette solution lorsque j'ai différents schémas de table dans une base de données (SQL Server): SELECT CONCAT (TABLE_SCHEMA, '.', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' ET TABLE_CATALOG = 'MyDB'
Verena Haunschmid

3
Il faut utiliser cette base de données particulière pour obtenir les informations. USE dbName GOpour SQL-Server. Si vous n'utilisez pas la base de données , le résultat ne sera pas affiché, même s'il existe des tables dans cette base de données.
barnes

2
Pour Mysql, vous pouvez faire simple. AFFICHER LES TABLES;
Ashish Gupta

L'entrée SQL Server fonctionne bien pour moi sans le USE dbName GOpréfixe sur Server 2014.
Mmm

1) Vous avez suggéré la même chose pour un serveur SQL et MySQL 2) INFORMATION_SCHEMA.TABLES n'existe que dans MySQL 3) Je me demande vraiment comment se fait-il que vous ayez eu autant de votes positifs pour cela ...
Apostolos

82

Volé d' ici :

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO

3
Très probablement SELECT Name FROM sys.Tables où is_ms_shipped = 0
om471987

1
il s'agit d'un fournisseur de base de données spécifique et non compatible ANSI SQL.
cjb110

1
Alternativement, SELECT * FROM yourdbname.sys.Tables; si vous préférez être plus concis. Fonctionne dans SQL Server, au moins.
buckminst

29

La requête suivante sélectionnera tous les éléments Tablesde la base de données nommés DBName:

USE DBName
GO 
SELECT *
FROM sys.Tables
GO

NON seulement Séparateur partiel. vous pouvez passer à autre. Ce n'est pas une syntaxe T-SQL.
anishMarokey

1
UTILISER DatabaseSample SELECT * FROM sys.Tables
Hamzeh Soboh

17
USE DBName;
SELECT * FROM sys.Tables;

Nous pouvons traiter sans GOà la place de vous pouvez utiliser un point-virgule ;.


3
Pour SQL Server sur Azure, cela a fonctionné pour moi, mais la réponse acceptée n'a pas fonctionné. Merci.
Jonah

14

Mettez juste DATABASE NAMEdevant INFORMATION_SCHEMA.TABLES:

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

10

Dans mysql, utilisez:

SHOW TABLES;

Après avoir sélectionné la DB avec:

USE db_name

Osm ,,, swt n short
Deepa MG

Ceci est MySQL, la question est taguée avec un serveur MSSQL
Melle

@Melle Regardez la description de la question
Lorenzo Lerate

Ce n'est pas la meilleure réponse, voir mon commentaire sous la réponse acceptée (et correcte).
Chiwda

6

Je n'ai pas vu cette réponse mais bon voici ce que je fais:

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

Avez-vous une chance de développer un peu ce que vous entendez par là? Peut-être l'expliquer?
Alex K

1
Exec sp_MSforeachtable 'Select ''?'''

Salut Amirreza, je crois que tu parles sp_MSforeachtable?
bummi

@bummi: oui génial, merci pour votre attention et désolé pour une erreur de frappe. Modifié
Amir Keshavarz

1
USE dbName;

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

Si vous travaillez avec plusieurs schémas sur un serveur MS SQL, alors SELECT-ing TABLE_NAME sans également sélectionner simultanément TABLE_SCHEMA pourrait être d'un avantage limité, donc j'ai supposé que nous sommes intéressés par les tables appartenant à un schéma connu lors de l'utilisation de MS SQL Server.

J'ai testé la requête ci-dessus avec SQL Server Management Studio en utilisant une de mes bases de données SQL Server et avec MySQL Workbench en utilisant une base de données MySQL, et dans les deux cas, elle donne les noms des tables.

La requête contient deux requêtes différentes de Michael Baylon en une seule qui peut ensuite s'exécuter sur l'un ou l'autre type de base de données. La première partie de la clause WHERE fonctionne sur les bases de données MySQL et la seconde partie (après le OU) fonctionne sur les bases de données MS SQL Server. C'est moche et logiquement un peu incorrect car cela suppose qu'il n'y a pas de schéma indésirable avec le même nom que la base de données. Cela pourrait aider quelqu'un qui recherche une seule requête pouvant s'exécuter sur l'un des serveurs de base de données.


1

MISE À JOUR DE LA DERNIÈRE VERSION DU SERVEUR MSSQL (17.7)

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

Ou SELECT *pour obtenir toutes les colonnes.


Je viens de réaliser que cette requête donne un résultat incorrect pour les caractères non anglais dans le nom de la table tandis que celui de Michael Baylon donne des résultats corrects. (le caractère était en minuscule turc "ı")
onur demir

1

Pour sélectionner la requête de base de données ci-dessous:

use DatabaseName

Maintenant

SELECT * FROM INFORMATION_SCHEMA.TABLES

Vous pouvez maintenant voir les tableaux créés ci-dessous dans la console.

PFA.

Requete


0

Oui, Oracle est:

select * from user_tables

C'est-à-dire si vous ne voulez que des objets appartenant aux personnes connectées, user/schemasinon vous pouvez utiliser all_tablesou dba_tablesqui inclut des tables système.


ils recherchent des requêtes multi-fournisseurs qui ne sont pas spécifiques à un fournisseur.
cjb110

Il n'y a aucun moyen cohérent de le faire à partir de SQL car tous les moteurs de base de données implémentent le dictionnaire de données différemment. Il pourrait être possible de résumer cela en utilisant jdbc / odbc et un langage 3GL tel que C / Java / C # s'il s'agit d'une exigence programmatique, certainement possible si vous avez une implémentation différente pour chaque base de données. L'op doit clarifier leurs exigences ...
kayakpim

0

Sur la base de la réponse de Michael Baylon, j'avais besoin d'une liste qui comprenait également des informations sur le schéma et c'est ainsi que j'ai modifié sa requête.

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

Dans notre base de données Oracle (PL / SQL) ci-dessous, le code fonctionne pour obtenir la liste de toutes les tables existantes dans notre base de données.

select * from tab;

et

select table_name from tabs;

les deux fonctionnent. essayons de trouver le vôtre.


0

Obtenez simplement toutes les informations improtanat avec ceci ci-dessous SQL dans 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;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.