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' 

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

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

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

11
SELECT * FROM information_schema.tables
where TABLE_TYPE = 'BASE TABLE'

SQL Server 2012


9
exec sp_msforeachtable 'print ''?'''

9
SELECT name 
FROM sysobjects 
WHERE xtype='U' 
ORDER BY name;

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



6
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U' 

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

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.

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

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

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 

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

0
--for oracle
select tablespace_name, table_name from all_tables;

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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.