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

304

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

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

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

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

Аван
источник
1
Для Mysql вы можете сделать просто. ПОКАЗАТЬ СТОЛЫ;
Ашиш Гупта

Ответы:

500

Вероятно, из-за того, как разные базы данных 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.

Майкл Бэйлон
источник
3
Я предпочитаю это решение , когда у меня есть различный таблица схем в пределах одной базы данных (SQL Server): SELECT CONCAT (TABLE_SCHEMA,, TABLE_NAME ' ') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'базовой таблицы' AND TABLE_CATALOG =' MyDB'
Верена Haunschmid
3
Нужно использовать эту конкретную БД для получения информации. USE dbName GOдля SQL-сервера. Если вы не используете БД , результат не будет отображаться, даже если в этой БД есть таблицы.
Барнс
2
Для Mysql вы можете сделать просто. ПОКАЗАТЬ СТОЛЫ;
Ашиш Гупта
Запись SQL Server прекрасно работает без USE dbName GOпрефикса на Server 2014.
Ммм,
1) Вы предложили то же самое для SQL Server и MySQL 2) INFORMATION_SCHEMA.TABLES существует только в MySQL 3) Мне действительно интересно, почему у вас так много голосов за это ...
Apostolos
82

Украдено отсюда :

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO
бла
источник
3
Скорее всего, SELECT Name FROM sys.Tables, где is_ms_shipped = 0
om471987
1
это зависит от поставщика базы данных и не совместимо с ANSI SQL.
cjb110
1
В качестве альтернативы, SELECT * FROM yourdbname.sys.Tables; если вы предпочитаете быть более кратким. Работает в SQL Server, по крайней мере.
Бакминст
29

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

USE DBName
GO 
SELECT *
FROM sys.Tables
GO
anishMarokey
источник
НЕТ, это только часть сепаратора. Вы можете изменить на другое. Это не синтаксис T-SQL.
anishMarokey
1
ИСПОЛЬЗОВАТЬ DatabaseSample SELECT * FROM sys.Tables
Hamzeh Soboh
17
USE DBName;
SELECT * FROM sys.Tables;

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

Gopal00005
источник
3
Для SQL Server в Azure это работало для меня, но принятый ответ - нет. Спасибо.
Иона
14

Просто поместите DATABASE NAMEперед INFORMATION_SCHEMA.TABLES:

select table_name from YOUR_DATABASE.INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE'
Дэвид С
источник
10

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

SHOW TABLES;

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

USE db_name
Лоренцо Лерате
источник
Osm ,,, swt n short
Дипа М.Г.
Это MySQL, вопрос помечен MSSQL-сервером
Melle
@Melle Посмотрите на описание вопроса
Лоренцо Лерате
Это не лучший ответ, см. Мой комментарий под принятым (и правильным) ответом.
Chiwda
6

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

SELECT name FROM databaseName.sys.Tables;
Дарио Чиммино
источник
3

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

Ашиш Гупта
источник
2
select * from sys.tables
order by schema_id      --comments: order by 'schema_id' to get the 'tables' in 'object explorer order'
go
Amanda
источник
Есть ли шанс, что вы могли бы немного уточнить, что вы подразумеваете под этим? Может это объяснить?
Алекс К
1
Exec sp_MSforeachtable 'Select ''?'''
Амир Кешаварз
источник
Привет, Амирреза, я думаю, ты о чем sp_MSforeachtable?
Бумми
@bummi: да, отлично, спасибо за внимание и извините за опечатку. Отредактировано
Амир Кешаварз
1
USE dbName;

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

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

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

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

Иван
источник
1

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

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

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

Тайлер
источник
Я только что понял, что этот запрос дает неправильный результат для неанглийских символов в имени таблицы, в то время как Майкл Бэйлон дает правильные результаты. (символ был на турецком языке строчными буквами "ı")
onur demir
1

Чтобы выбрать запрос к базе данных ниже:

use DatabaseName

Сейчас

SELECT * FROM INFORMATION_SCHEMA.TABLES

Теперь вы можете увидеть созданные таблицы ниже в консоли.

PFA.

запрос

Тарит Рэй
источник
0

Да оракул это:

select * from user_tables

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

kayakpim
источник
они ищут межпроцессные запросы, не зависящие от поставщика
cjb110
Нет единого способа сделать это из sql, поскольку все движки БД по-разному реализуют словарь данных. Это можно абстрагировать, используя jdbc / odbc и язык 3GL, такой как C / Java / C #, если это является программным требованием, что, безусловно, возможно, если у вас разные реализации для каждой базы данных. Оператор должен уточнить свои требования ...
каякпим
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

В нашей базе данных Oracle (PL / SQL) ниже приведен код, работающий для получения списка всех существующих таблиц в нашей БД.

select * from tab;

и

select table_name from tabs;

оба работают. давайте попробуем найти ваше.

Джамал Уддин
источник
0

Просто получите всю информацию о imptanat с этим ниже SQL в Mysql

    SELECT t.TABLE_NAME , t.ENGINE , t.TABLE_ROWS ,t.AVG_ROW_LENGTH, 
t.INDEX_LENGTH FROM 
INFORMATION_SCHEMA.TABLES as t where t.TABLE_SCHEMA = 'YOURTABLENAMEHERE' 
order by t.TABLE_NAME ASC limit 10000;
Патель Нихил
источник