Obter todos os nomes de tabelas de um database específico por consulta SQL?

Eu estou trabalhando em aplicativos que podem lidar com vários servidores de database como “MySQL” e “MS SQL Server”.

Eu quero obter nomes de tabelas de um database específico usando uma consulta geral que deve ser adequada para todos os tipos de database. Eu tentei seguir:

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

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

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

Tente o seguinte

Para o 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 o Oracle, acho que o equivalente seria usar DBA_TABLES .

Roubado daqui :

 USE YOURDBNAME GO SELECT * FROM sys.Tables GO 

A consulta a seguir selecionará todas as Tables no database chamado DBName :

 USE DBName GO SELECT * FROM sys.Tables GO 
 USE DBName; SELECT * FROM sys.Tables; 

Nós podemos lidar sem GO no lugar de você pode usar ponto ; vírgula ; .

Basta colocar o DATABASE NAME na frente de INFORMATION_SCHEMA.TABLES :

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

No mysql, use:

 SHOW TABLES; 

Depois de selecionar o database com:

 USE db_name 

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

 SELECT name FROM databaseName.sys.Tables; 

Para o Mysql você pode fazer simples. MOSTRAR TABELAS;

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

Sim oráculo é:

 select * from user_tables 

Isto é, se você deseja apenas objects pertencentes ao user/schema logado, caso contrário, você pode usar all_tables ou dba_tables que inclui tabelas do sistema.

Construindo a partir da 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 
 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, SELECT-ing TABLE_NAME sem selecionar simultaneamente TABLE_SCHEMA pode ser de benefício limitado, então assumi que estamos interessados ​​nas tabelas pertencentes a um esquema conhecido ao usar o MS SQL Server.

Eu testei a consulta acima com o SQL Server Management Studio usando um database do meu SQL Server e com o MySQL Workbench usando um database MySQL, e em ambos os casos ele fornece os nomes das tabelas.

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

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.