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

235

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

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

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

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

  • 0
    Для Mysql вы можете сделать просто. ШОУ-СТОЛЫ;
Теги:
sql-server

15 ответов

409
Лучший ответ

Вероятно, из-за того, что разные транзакции 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
    Я предпочитаю это решение, когда у меня есть разные схемы таблиц в одной базе данных (SQL Server): SELECT CONCAT (TABLE_SCHEMA, '.', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' И TABLE_CATALOG = 'MyDB'
  • 3
    Нужно использовать эту конкретную БД для получения информации. USE dbName GO для SQL-сервера. Если вы не используете БД , результат не будет отображаться, даже если в этой БД есть таблицы.
Показать ещё 4 комментария
71

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

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO
  • 3
    Скорее всего, SELECT Name FROM sys.Tables, где is_ms_shipped = 0
  • 1
    это зависит от поставщика базы данных и не совместимо с ANSI SQL.
Показать ещё 1 комментарий
23

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

USE DBName
GO 
SELECT *
FROM sys.Tables
GO
  • 0
    «Go» является частью запроса ??
  • 0
    НЕТ, это только часть сепаратора. Вы можете изменить на другое. Это не синтаксис T-SQL.
Показать ещё 1 комментарий
16
USE DBName;
SELECT * FROM sys.Tables;

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

  • 3
    Для SQL Server в Azure это работало для меня, но принятый ответ - нет. Благодарю.
13

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

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

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

SHOW TABLES;

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

USE db_name
  • 0
    Osm ,,, swt n short
  • 0
    Это MySQL, вопрос помечен MSSQL сервером
Показать ещё 1 комментарий
6

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

SELECT name FROM databaseName.sys.Tables;
4

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

2
select * from sys.tables
order by schema_id      --comments: order by 'schema_id' to get the 'tables' in 'object explorer order'
go
  • 0
    Есть ли шанс, что вы могли бы немного уточнить, что вы подразумеваете под этим? Может это объяснить?
1

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

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

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

  • 0
    Я только что понял, что этот запрос дает неправильный результат для неанглийских символов в имени таблицы, в то время как Майкл Бэйлон дает правильные результаты. (символ был на турецком языке строчными буквами "ı")
1
Exec sp_MSforeachtable 'Select ''?'''
  • 0
    Привет, Амирреза. Я полагаю, вы говорите о sp_MSforeachtable ?
  • 0
    @bummi: да, отлично, спасибо за внимание и извините за опечатку. отредактированный
0

пожалуйста, заполните параметр @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('+@AllTableNames+N')at where tablename like '''+N'%'+@likeTablename+N'%'+N''''
exec sp_executesql  @AllTableNames
0
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. Это уродливое и логически немного неверное, поскольку предполагает, что нет нежелательной схемы с тем же именем, что и база данных. Это может помочь кому-то, кто ищет один запрос, который может запускаться на любом сервере базы данных.

0

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

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

Да, оракул:

select * from user_tables

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

  • 0
    они ищут запросы кросс-провайдера, не зависящие от провайдера.
  • 0
    Нет единого способа сделать это из sql, поскольку все движки БД по-разному реализуют словарь данных. Можно абстрагировать это, используя jdbc / odbc и язык 3GL, такой как C / Java / C #, если это является программным требованием, безусловно, возможно, если у вас есть разные реализации для каждой базы данных. Оп должен уточнить свои требования ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню