Obter todos os nomes de tabela de um banco de dados específico por consulta SQL?

304

Estou trabalhando em um aplicativo que pode lidar com vários servidores de banco de dados como "MySQL" e "MS SQL Server".

Desejo obter os nomes das tabelas de um banco de dados específico usando uma consulta geral adequada para todos os tipos de banco de dados. Eu tentei o seguinte:

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

Mas está dando nomes de tabela de todos os bancos de dados de um servidor específico, mas quero obter apenas nomes de tabelas do banco de dados selecionado. Como posso restringir esta consulta para obter tabelas de um banco de dados específico?

Awan
fonte
1
Para o Mysql você pode fazer coisas simples. MOSTRAR MESAS;
Ashish Gupta

Respostas:

500

Provavelmente devido à maneira como diferentes dbms sql lidam com esquemas.

Tente o seguinte

Para SQL Server:

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

Para o MySQL:

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

Para a Oracle, acho que o equivalente seria usar DBA_TABLES.

Michael Baylon
fonte
3
Prefiro esta solução quando tenho esquemas de tabela diferentes em um banco de dados (SQL Server): SELECT CONCAT (TABLE_SCHEMA, '.', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' E TABLE_CATALOG = 'MyDB'
Verena Haunschmid
3
É preciso usar esse banco de dados específico para obter as informações. USE dbName GOpara SQL-Server. Se você não estiver usando o banco de dados , o resultado não será exibido, mesmo se houver tabelas nesse banco de dados.
barnes
2
Para o Mysql você pode fazer coisas simples. MOSTRAR MESAS;
Ashish Gupta
A entrada do SQL Server funciona bem para mim sem o USE dbName GOprefixo no Server 2014.
Mmm
1) Você já sugeriu a mesma coisa para um SQL Server e MySQL 2) INFORMATION_SCHEMA.TABLES existe apenas no MySQL 3) Pergunto-me como vem você tem tantas upvotes para isso ...
Apostolos
82

Roubado daqui :

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO
bla
fonte
3
Provavelmente, SELECT Name FROM sys.Tables em que is_ms_shipped = 0
om471987
1
isso é específico do provedor de banco de dados e não é compatível com ANSI SQL.
Cjb110
1
Como alternativa, SELECT * FROM yourdbname.sys.Tables; se você preferir ser mais conciso. Funciona no SQL Server, pelo menos.
buckminst
29

A consulta a seguir selecionará todos Tablesos dados no banco de dados chamado DBName:

USE DBName
GO 
SELECT *
FROM sys.Tables
GO
anishMarokey
fonte
NÃO, apenas parte separador. você pode mudar para outro. Não é uma sintaxe T-SQL.
anishMarokey
1
Use DatabaseSample SELECT * FROM sys.Tables
Hamzeh Soboh
17
USE DBName;
SELECT * FROM sys.Tables;

Podemos lidar sem que GOvocê possa usar ponto e vírgula ;.

Gopal00005
fonte
3
Para o SQL Server no Azure, isso funcionou para mim, mas a resposta aceita não. Obrigado.
Jonah
14

Basta colocar DATABASE NAMEna frente de INFORMATION_SCHEMA.TABLES:

select table_name from YOUR_DATABASE.INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE'
David S
fonte
10

No mysql, use:

SHOW TABLES;

Após selecionar o banco de dados com:

USE db_name
Lorenzo Lerate
fonte
Osm ,,, swt n short
Deepa MG 24/09
Esta é MySQL, questão é marcado sagacidade servidor MSSQL
Melle
@Melle Veja a descrição da pergunta #
Lorenzo Lerate
Esta não é a melhor resposta, veja meu comentário na resposta aceita (e correta).
Chiwda
6

Eu não vi essa resposta, mas ei isso é o que eu faço:

SELECT name FROM databaseName.sys.Tables;
Dario Cimmino
fonte
3

Para o Mysql você pode fazer coisas simples. MOSTRAR MESAS;

Ashish Gupta
fonte
2
select * from sys.tables
order by schema_id      --comments: order by 'schema_id' to get the 'tables' in 'object explorer order'
go
amanda
fonte
Alguma chance de você elaborar um pouco sobre o que você quer dizer com isso? Talvez explique isso?
Alex K
1
Exec sp_MSforeachtable 'Select ''?'''
Amir Keshavarz
fonte
Oi Amirreza, acredito que você está falando sp_MSforeachtable?
Bummi
@mimi: sim, ótimo, obrigado pela atenção e desculpe-me pelo erro de digitação. Editado
Amir Keshavarz
1
USE dbName;

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

Se você estiver trabalhando com vários esquemas em um servidor MS SQL, a seleção de TABLE_NAME sem selecionar simultaneamente simultaneamente TABLE_SCHEMA pode ser de benefício limitado, portanto, presumi que estamos interessados ​​nas tabelas pertencentes a um esquema conhecido ao usar o MS SQL Server.

Testei a consulta acima com o SQL Server Management Studio usando um banco de dados meu do SQL Server e com o MySQL Workbench usando um banco de dados MySQL e, nos dois casos, fornece os nomes das tabelas.

A consulta reúne as duas consultas diferentes de Michael Baylon em uma que pode ser executada em qualquer tipo de banco de dados. A primeira parte da cláusula WHERE funciona nos bancos de dados MySQL e a segunda parte (após o OR) funciona nos bancos de dados do MS SQL Server. É feio e logicamente um pouco incorreto, pois supõe que não há esquema indesejado com o mesmo nome que o banco de dados. Isso pode ajudar alguém que está procurando uma única consulta que possa ser executada em qualquer servidor de banco de dados.

Ivan
fonte
1

ATUALIZAÇÃO PARA A VERSÃO MAIS RECENTE DO MSSQL SERVER (17.7)

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

Ou SELECT *para obter todas as colunas.

Tyler
fonte
Acabei de perceber que essa consulta fornece resultados incorretos para caracteres não ingleses no nome da tabela, enquanto Michael Baylon fornece resultados corretos. (o caractere estava em minúsculas "ı" no idioma turco)
onur demir
1

Para selecionar a consulta ao banco de dados abaixo:

use DatabaseName

Agora

SELECT * FROM INFORMATION_SCHEMA.TABLES

Agora você pode ver as tabelas criadas abaixo no console.

PFA.

Inquerir

Tarit Ray
fonte
0

Sim oracle é:

select * from user_tables

Ou seja, se você deseja apenas objetos de propriedade do logon, user/schemacaso contrário, você pode usar all_tablesou dba_tablesincluir tabelas do sistema.

kayakpim
fonte
eles estão procurando consultas entre fornecedores não específicas do fornecedor.
Cjb110
Não existe uma maneira consistente de fazer isso no sql, pois todos os mecanismos db implementam o dicionário de dados de maneira diferente. Talvez seja possível abstrair isso usando jdbc / odbc e uma linguagem 3GL como C / Java / C # se esse for um requisito programático, definitivamente possível se você tiver uma implementação diferente para cada banco de dados. O op deve esclarecer as suas necessidades ...
kayakpim
0

Com base na resposta de Michael Baylon, eu precisava de uma lista que também incluísse informações de esquema e foi assim que modifiquei sua consulta.

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
Jason L.
fonte
0

Em nosso banco de dados Oracle (PL / SQL) abaixo, o código está funcionando para obter a lista de todas as tabelas existentes em nosso banco de dados.

select * from tab;

e

select table_name from tabs;

ambos estão trabalhando. vamos tentar encontrar o seu.

Mestre Jamal Uddin
fonte
0

Basta obter todas as informações improtanat com isso abaixo do SQL no 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;
Patel Nikhil
fonte