web-dev-qa-db-fra.com

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

Je travaille sur une application pouvant gérer plusieurs serveurs de base de données tels que "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 souhaite obtenir uniquement les noms de table de la base de données sélectionnée. Comment puis-je limiter cette requête pour obtenir des tables d'une base de données particulière?

274
Awan

Probablement en raison de la façon dont différents dlms 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.

442
Michael Baylon

Volé de ici :

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO
75
bla

La requête suivante sélectionnera tous les Tables de la base de données nommée DBName:

USE DBName
GO 
SELECT *
FROM sys.Tables
GO
26
anishMarokey
USE DBName;
SELECT * FROM sys.Tables;

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

16
Gopal00005

Il suffit de mettre le DATABASE NAME devant INFORMATION_SCHEMA.TABLES:

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

Dans mysql, utilisez:

SHOW TABLES;

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

USE db_name
10
Lorenzo Lerate

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

SELECT name FROM databaseName.sys.Tables;
6
Dario Cimmino
select * from sys.tables
order by schema_id      --comments: order by 'schema_id' to get the 'tables' in 'object Explorer order'
go
2
amanda

Pour Mysql, vous pouvez faire simple. MONTRER LES TABLEAUX;

2
Ashish Gupta

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

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

Ou SELECT * pour obtenir toutes les colonnes.

1
Tyler
Exec sp_MSforeachtable 'Select ''?'''
1
Amir Keshavarz
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, le choix de TABLE_NAME sans sélectionner simultanément TABLE_SCHEMA peut présenter des avantages limités. J'ai donc supposé que nous nous intéressions aux tables appartenant à un schéma connu lorsque vous utilisez 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. Dans les deux cas, il donne les noms des tables.

La requête intègre les deux requêtes de Michael Baylon en une requête pouvant 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 l'OR) sur les bases de données MS SQL Server. Il est moche et logiquement un peu incorrect car cela suppose qu’il n’y ait pas de schéma non souhaité portant le même nom que la base de données. Cela peut aider quelqu'un qui recherche une requête unique pouvant être exécutée sur l'un des serveurs de base de données.

0
Ivan

En me basant sur la réponse de Michael Baylon, il me fallait une liste comprenant également des informations sur le schéma et voici comment 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
Jason L.

Oui Oracle est:

select * from user_tables

C’est-à-dire si vous ne voulez que les objets appartenant à l’opérateur connecté user/schema sinon vous pouvez utiliser all_tables ou dba_tables qui inclut les tables système.

0
kayakpim