Получить все имена таблиц конкретной базы данных по 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