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?
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
.
A seguinte consulta irá seleccionar toda a Tables
na base de dados chamada DBName
:
USE DBName
GO
SELECT *
FROM sys.Tables
GO
USE DBName;
SELECT * FROM sys.Tables;
Podemos lidar sem GO
no lugar de você pode usar semicolon ;
.
DATABASE NAME
à frente do INFORMATION_SCHEMA.TABLES
:
select table_name from YOUR_DATABASE.INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE'
Em mysql, usar:
SHOW TABLES;
Depois de seleccionar o DB com:
USE db_name
Não vi esta resposta, mas isto é o que eu faço :
SELECT name FROM databaseName.sys.Tables;
Para o Mysql você pode fazer simples. MOSTRAR AS 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 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.
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 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.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.