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?
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
.
Volé de ici :
USE YOURDBNAME
GO
SELECT *
FROM sys.Tables
GO
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
USE DBName;
SELECT * FROM sys.Tables;
Nous pouvons traiter sans GO
à la place de vous pouvez utiliser le point-virgule ;
.
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'
Dans mysql, utilisez:
SHOW TABLES;
Après avoir sélectionné le DB avec:
USE db_name
Je n'ai pas vu cette réponse mais bon c'est ce que je fais:
SELECT name FROM databaseName.sys.Tables;
select * from sys.tables
order by schema_id --comments: order by 'schema_id' to get the 'tables' in 'object Explorer order'
go
Pour Mysql, vous pouvez faire simple. MONTRER LES TABLEAUX;
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.
Exec sp_MSforeachtable 'Select ''?'''
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.
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
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.