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

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

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

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

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

Ответ 1

Вероятно, из-за того, что разные транзакции sql dbms имеют схемы.

Попробуйте выполнить

Для 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.

Ответ 2

Украден из здесь:

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO

Ответ 3

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

USE DBName
GO 
SELECT *
FROM sys.Tables
GO

Ответ 4

USE DBName;
SELECT * FROM sys.Tables;

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

Ответ 5

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

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

Ответ 6

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

SHOW TABLES;

После выбора БД с помощью:

USE db_name

Ответ 7

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

SELECT name FROM databaseName.sys.Tables;

Ответ 8

Для Mysql вы можете сделать простой. SHOW TABLES;

Ответ 9

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

Ответ 10

Exec sp_MSforeachtable 'Select ''?'''

Ответ 11

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

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

Или SELECT * для получения всех столбцов.

Ответ 12

Да, оракул:

select * from user_tables

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

Ответ 13

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

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

Ответ 14

USE dbName;

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

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

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

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

Ответ 15

пожалуйста, заполните параметр @likeTablename для таблицы поиска.

теперь этот параметр установлен в% tbltrans% для поиска во всех таблицах, содержащих имя tbltrans.

установите @likeTablename в "%", чтобы показать всю таблицу.

declare @AllTableNames nvarchar(max);

select  @AllTableNames=STUFF((select ' SELECT  TABLE_CATALOG collate DATABASE_DEFAULT+''.''+TABLE_SCHEMA collate DATABASE_DEFAULT+''.''+TABLE_NAME collate DATABASE_DEFAULT as tablename FROM '+name+'.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = ''BASE TABLE'' union '
 FROM master.sys.databases 
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)') 
,1,1,'');

set @AllTableNames=left(@AllTableNames,len(@AllTableNames)-6)

declare @likeTablename nvarchar(200)='%tbltrans%';
set @AllTableNames=N'select tablename from('[email protected]+N')at where tablename like '''+N'%'[email protected]+N'%'+N''''
exec sp_executesql  @AllTableNames