Получить все имена таблиц конкретной базы данных по SQL-запросу?

Я работаю над приложением, которое может работать с несколькими серверами баз данных, такими как "MySQL" и "MS SQL Server".

Я хочу получить имена таблиц конкретной базы данных, используя общий запрос, который должен подходить для всех типов баз данных. Я попробовал следующее:

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

но он дает имена таблиц всех баз данных конкретного сервера, но я хочу получить имена таблиц только выбранной базы данных. Как я могу ограничить этот запрос, чтобы получить таблицы конкретного база данных?

14 ответов


вероятно, из-за того, как разные СУБД sql имеют дело со схемами.

попробуйте следующее

для SQL Server:

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

Для MySQL:

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

для Oracle, я думаю, что эквивалент будет использовать DBA_TABLES.


похищенные из здесь:

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO

следующий запрос выберет все Tables в базе данных с именем DBName:

USE DBName
GO 
SELECT *
FROM sys.Tables
GO

USE DBName;
SELECT * FROM sys.Tables;

мы можем обойтись без GO на месте вы можете использовать точку с запятой ;.


просто поставить DATABASE NAME перед INFORMATION_SCHEMA.TABLES:

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

в mysql используйте:

SHOW TABLES;

после выбора БД:

USE db_name

Я не видел этого ответа, но эй, это то, что я делаю:

SELECT name FROM databaseName.sys.Tables;

для Mysql вы можете сделать просто. ПОКАЗАТЬ ТАБЛИЦЫ;


Exec sp_MSforeachtable 'Select ''?'''

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

да oracle это:

select * from user_tables

то есть, если вы хотите только объекты, принадлежащие вошедшему в систему user/schema в противном случае вы можете использовать all_tables или dba_tables которая включает в себя системные таблицы.


основываясь на ответе Майкла Бейлона, мне нужен был список, который также включал информацию о схеме, и именно так я изменил его запрос.

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

USE dbName;

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

Если вы работаете с несколькими схемами на сервере MS SQL, то выбор-ing TABLE_NAME без одновременного выбора TABLE_SCHEMA может иметь ограниченную выгоду, поэтому я предположил, что нас интересуют таблицы, принадлежащие известной схеме при использовании MS SQL Server.

Я проверил запрос выше с помощью SQL Server Management Studio, используя мою базу данных SQL Server, и с MySQL Workbench, используя базу данных MySQL, и в обоих случаях он дает таблицу имена.

запрос объединяет два разных запроса Майкла Бейлона в один, который затем может выполняться для любого типа базы данных. Первая часть предложения WHERE работает с базами данных MySQL, а вторая часть (после OR) работает с базами данных MS SQL Server. Это уродливо и логически немного неверно, поскольку он предполагает, что нет нежелательной схемы с тем же именем, что и база данных. Это может помочь тому, кто ищет один единственный запрос, который может выполняться на любом сервере базы данных.


ОБНОВЛЕНИЕ ДЛЯ ПОСЛЕДНЕЙ ВЕРСИИ MSSQL SERVER (17.7)

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

или SELECT * для всех столбцов.