Como obtenho uma lista de todas as tabelas em um banco de dados usando o TSQL?

Respostas:

1429

SQL Server 2000, 2005, 2008, 2012, 2014, 2016, 2017 ou 2019:

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

Para mostrar apenas tabelas de um banco de dados específico

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

Ou,

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE = 'BASE TABLE' 
    AND TABLE_CATALOG='dbName' --(for MySql, use: TABLE_SCHEMA='dbName' )

PS: para SQL Server 2000:

SELECT * FROM sysobjects WHERE xtype='U' 
ScottStonehouse
fonte
46
Por favor, note que este irá também incluir VISTAS, não apenas tabelas
Nathan Koop
17
Adicione o nome do banco de dados se você não estiver usando o banco de dados específico por isso vai ser SELECIONAR TABLE_NAME de <database_name> .INFORMATION_SCHEMA.Tables
Shriroop
22
A adição WHERE TABLE_TYPE='BASE TABLE'incluirá apenas tabelas base (e por extensão você sempre pode usar WHERE TABLE_TYPE != 'VIEW').
Phillip Copley
3
"sysdiagrams" também aparece nesta lista :(
celsowm 24/11
4
sysdiagrams é uma tabela normal, você sempre deve excluí-la manualmente com a AND name <> 'sysdiagrams'.
Christoph
199
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U'

Aqui está uma lista de outros tipos de objetos que você também pode procurar:

  • AF: Função agregada (CLR)
  • Restrição C: CHECK
  • D: Restrição padrão ou PADRÃO
  • F: Restrição de CHAVE ESTRANGEIRA
  • L: Log
  • FN: Função escalar
  • FS: Função escalar Assembly (CLR)
  • FT: Função com valor de tabela Assembly (CLR)
  • IF: função de tabela alinhada
  • IT: Tabela interna
  • P: Procedimento armazenado
  • Procedimento armazenado PC: Assembly (CLR)
  • Restrição PK: PRIMARY KEY (o tipo é K)
  • RF: Procedimento armazenado do filtro de replicação
  • S: Tabela do sistema
  • SN: sinônimo
  • SQ: fila de serviço
  • TA: gatilho DML do Assembly (CLR)
  • TF: função de tabela
  • TR: Disparador DML SQL
  • TT: Tipo de tabela
  • U: tabela de usuários
  • UQ: restrição ÚNICA (o tipo é K)
  • V: Visualizar
  • X: procedimento armazenado estendido
Micah
fonte
9
O alias é um pouco redundante: SELECT name FROM sysobjects WHERE xtype = 'U'faria a mesma coisa.
PJSCopeland
Obrigado, inicialmente eu tentei isso com várias instruções de seleção para PK,FK,D,C,V,UQetc para comparar o banco de dados de origem e destino, mas então encontrei esse recurso no VS, mas não existe um sql querypara comparar o banco de dados completo de origem e destino?
shaijut 03/12/2015
Alguém se pergunta por que 'U'é usado para identificar a Tabela de Usuários ... em vez de talvez 'UT'ou, o mais intuitivo, 'T'... Ah, bem, isso funciona!
user919426
87
SELECT * FROM INFORMATION_SCHEMA.TABLES 

OU

SELECT * FROM Sys.Tables
StingyJack
fonte
5
Apenas uma nota que (como mencionado em outras respostas) sys.tables só está disponível em 2005 em diante
Rob
2
Que não é um problema em 2018. Eu acho que isso deve ser maior :-)
Michal B.
29
USE YourDBName
GO 
SELECT *
FROM sys.Tables
GO

OU

USE YourDBName
GO
SELECT * FROM INFORMATION_SCHEMA.TABLES 
GO
Vikash Singh
fonte
11
SELECT * FROM information_schema.tables
where TABLE_TYPE = 'BASE TABLE'

SQL Server 2012

Rasoul Zabihi
fonte
9
exec sp_msforeachtable 'print ''?'''
Raio
fonte
9
SELECT name 
FROM sysobjects 
WHERE xtype='U' 
ORDER BY name;

(Padrão do SQL Server 2000; ainda com suporte no SQL Server 2005.)

devio
fonte
7

select * from sysobjects where xtype='U'

Spoulson
fonte
6
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U' 
Erikk Ross
fonte
SELECT name FROM sysobjects WHERE xtype='U' AND name <> 'sysdiagrams'; porque a tabela sysdiagrams, embora criada pelo Microsoft SQL Server Management Studio, tecnicamente não é uma tabela do sistema, mas geralmente gostamos de excluir de qualquer maneira.
Christoph
5

A desvantagem INFORMATION_SCHEMA.TABLESdisso é que ele também inclui tabelas de sistema como dtpropertiese as MSpeer_...tabelas, sem nenhuma maneira de diferenciá-las de suas próprias tabelas.

Eu recomendaria usar sys.objects(a nova versão da exibição de sysobjects obsoleta ), que suporta a exclusão das tabelas do sistema:

select *
from sys.objects
where type = 'U'      -- User tables
and is_ms_shipped = 0 -- Exclude system tables
Astrotrain
fonte
2

No SSMS, para obter todos os nomes de tabela totalmente qualificados em um banco de dados específico (por exemplo, "MyDatabase"):

SELECT [TABLE_CATALOG] + '.' + [TABLE_SCHEMA] + '.' + [TABLE_NAME]
FROM   MyDatabase.INFORMATION_SCHEMA.Tables
WHERE  [TABLE_TYPE] = 'BASE TABLE' and [TABLE_NAME] <> 'sysdiagrams'
ORDER BY [TABLE_SCHEMA], [TABLE_NAME]

Resultados:

  • MyDatabase.dbo.MyTable1
  • MyDatabase.dbo.MyTable2
  • MyDatabase.MySchema.MyTable3
  • MyDatabase.MySchema.MyTable4
  • etc.
Scott Software
fonte
2

Por favor, use isso. Você obterá nomes de tabela junto com nomes de esquema:

SELECT SYSSCHEMA.NAME, SYSTABLE.NAME
FROM SYS.tables SYSTABLE
INNER JOIN SYS.SCHEMAS SYSSCHEMA
ON SYSTABLE.SCHEMA_ID = SYSSCHEMA.SCHEMA_ID
Vikash
fonte
1
SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE='BASE TABLE' 
ORDER BY TABLE_NAME
Desenvolvedor
fonte
1

Graças a Ray Vega, cuja resposta fornece todas as tabelas de usuários em um banco de dados ...

exec sp_msforeachtable 'print' '?' ''

sp_helptext mostra a consulta subjacente, resumida em ...

select * from dbo.sysobjects o 
join sys.all_objects syso on o.id =  syso.object_id  
where OBJECTPROPERTY(o.id, 'IsUserTable') = 1 
and o.category & 2 = 0 
Frank
fonte
1

Bem, você pode usar sys.objects para obter todos os objetos de banco de dados.

 GO
 select * from sys.objects where type_desc='USER_TABLE' order by name
 GO

OU

--  For all tables
select * from INFORMATION_SCHEMA.TABLES 
GO 

  --- For user defined tables
select * from INFORMATION_SCHEMA.TABLES where TABLE_TYPE='BASE TABLE'
GO

  --- For Views
select * from INFORMATION_SCHEMA.TABLES where TABLE_TYPE='VIEW'
GO
DarkRob
fonte
0
--for oracle
select tablespace_name, table_name from all_tables;

Este link pode fornecer muito mais informações sobre este tópico

Demietra95
fonte
2
Isso não é para o SQL Server, portanto, não é uma resposta para esta pergunta.
Dan Getz
0

O uso SELECT * FROM INFORMATION_SCHEMA.COLUMNStambém mostra todas as tabelas e colunas relacionadas.

Masoud Darvishian
fonte