Obter todos os nomes de tabelas de uma determinada base de dados por consulta SQL?

estou a trabalhar numa aplicação que pode lidar com vários servidores de bases de dados como "MySQL" e "MS SQL Server".

quero obter os nomes das tabelas de uma determinada base de dados usando uma consulta geral que deve ser adequada para todos os tipos de base de dados. Eu tentei o seguinte:

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

mas está a dar nomes de tabelas de todas as bases de dados de um servidor em particular, mas eu quero obter nomes de tabelas apenas da base de dados seleccionada. Como posso restringir esta consulta para obter tabelas de uma determinada base de dados?

Author: Tony L., 2010-10-12

14 answers

Provavelmente devido à forma como diferentes dbms SQL lidam com esquemas.

Tente o seguinte

Para o servidor SQL:

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.

 376
Author: Michael Baylon, 2015-04-02 08:17:36

Roubado de aqui:

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO
 69
Author: bla, 2010-10-12 10:27:16

A seguinte consulta irá seleccionar toda a Tables na base de dados chamada DBName:

USE DBName
GO 
SELECT *
FROM sys.Tables
GO
 23
Author: anishMarokey, 2017-10-03 16:03:35
USE DBName;
SELECT * FROM sys.Tables;

Podemos lidar sem GO no lugar de você pode usar semicolon ;.

 15
Author: Gopal00005, 2017-04-19 10:37:01
Põe o DATABASE NAME à frente do INFORMATION_SCHEMA.TABLES:
select table_name from YOUR_DATABASE.INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE'
 13
Author: David S, 2014-05-21 00:01:29

Em mysql, usar:

SHOW TABLES;

Depois de seleccionar o DB com:

USE db_name
 8
Author: Lorenzo Lerate, 2015-08-29 13:23:41

Não vi esta resposta, mas isto é o que eu faço :

SELECT name FROM databaseName.sys.Tables;
 6
Author: Dario Cimmino, 2017-06-14 18:39:53

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

 4
Author: Ashish Gupta, 2016-11-08 00:38:10
Exec sp_MSforeachtable 'Select ''?'''
 1
Author: Amir Keshavarz, 2014-09-22 07:41:26
select * from sys.tables
order by schema_id      --comments: order by 'schema_id' to get the 'tables' in 'object explorer order'
go
 1
Author: amanda, 2015-03-25 09:23:20

Sim oracle é:

select * from user_tables

Isto é, se só quiser objectos que sejam propriedade do logado user/schema caso contrário, poderá usar all_tables ou dba_tables que inclui tabelas do sistema.

 0
Author: kayakpim, 2015-03-25 09:02:08
Construindo a partir da resposta de Michael Baylon, eu precisava de uma lista que também incluísse informações do esquema e foi assim que modifiquei a 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
 0
Author: Jason L., 2015-12-09 15:48:54
USE dbName;

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

Se estiver a trabalhar com vários esquemas num servidor de MS SQL, então seleccione o TABLE_NAME sem também seleccionar simultaneamente o TABLE_SCHEMA poderá ser de benefício limitado, por isso assumi que estamos interessados nas tabelas pertencentes a um esquema conhecido ao usar o servidor de MS SQL.

Eu testei a consulta acima com o SQL Server Management Studio usando uma base de dados do servidor SQL minha e com o MySQL Workbench usando uma base de dados MySQL, e em ambos os casos dá a tabela nome.

A consulta divide as duas consultas diferentes do Michael Baylon numa que pode ser executada em qualquer tipo de base de dados. A primeira parte da cláusula WHERE funciona em bases de dados MySQL e a segunda parte (após o BO) funciona em bases de dados do servidor MS SQL. É feio e logicamente um pouco incorreto, pois supõe que não há nenhum esquema indesejado com o mesmo nome que a base de dados. Isto pode ajudar alguém que está à procura de uma única consulta que pode correr em qualquer servidor de banco de dados.
 0
Author: user3070485, 2016-06-20 10:56:31

ACTUALIZAR PARA A ÚLTIMA VERSÃO DO SERVIDOR MSSQL(17.7)

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

Ou SELECT * para obter todas as colunas.

 0
Author: Tyler, 2018-07-18 11:32:38