¿Cómo obtengo una lista de todas las tablas en una base de datos usando TSQL?

Respuestas:

1429

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

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

Para mostrar solo tablas de una base de datos particular

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

O,

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

PD: para SQL Server 2000:

SELECT * FROM sysobjects WHERE xtype='U' 
ScottStonehouse
fuente
46
Tenga en cuenta que esto también incluirá VISTAS, no solo tablas
Nathan Koop el
17
Agregue el nombre de la base de datos si no está utilizando la base de datos específica para que sea SELECT TABLE_NAME FROM <DATABASE_NAME> .INFORMATION_SCHEMA.Tables
Shriroop
22
Agregar WHERE TABLE_TYPE='BASE TABLE'solo incluirá tablas base (y, por extensión, siempre podría usar WHERE TABLE_TYPE != 'VIEW').
Phillip Copley
3
"sysdiagrams" también aparece en esta lista :(
celsowm
44
sysdiagrams es una tabla normal, siempre debe excluirla manualmente con a AND name <> 'sysdiagrams'.
Christoph
199
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U'

Aquí hay una lista de otros tipos de objetos que puede buscar también:

  • AF: función agregada (CLR)
  • C: restricción CHECK
  • D: Restricción predeterminada o POR DEFECTO
  • F: restricción de CLAVE EXTRANJERA
  • L: registro
  • FN: función escalar
  • FS: función escalar de ensamblaje (CLR)
  • FT: función de valor de tabla de ensamblado (CLR)
  • IF: función de tabla en línea
  • IT: mesa interna
  • P: procedimiento almacenado
  • PC: procedimiento almacenado de ensamblaje (CLR)
  • PK: restricción de PRIMARY KEY (el tipo es K)
  • RF: procedimiento almacenado del filtro de replicación
  • S: tabla del sistema
  • SN: Sinónimo
  • SQ: cola de servicio
  • TA: Disparador DML de ensamblaje (CLR)
  • TF: función de tabla
  • TR: Disparador DML SQL
  • TT: tipo de tabla
  • U: tabla de usuario
  • UQ: restricción ÚNICA (el tipo es K)
  • V: Ver
  • X: procedimiento almacenado extendido
Micah
fuente
99
El alias es un poco redundante: SELECT name FROM sysobjects WHERE xtype = 'U'haría lo mismo.
PJSCopeland
Gracias, inicialmente probé esto con múltiples sentencias select para PK,FK,D,C,V,UQetc. para comparar la base de datos de origen y destino, pero luego encontré esta característica en VS, pero ¿no hay una sql querypara comparar la base de datos completa de origen y destino?
shaijut
Uno se pregunta por qué 'U'se usa para identificar la tabla de usuarios ... en lugar de tal vez 'UT'o, la más intuitiva, 'T'... ¡Ah, bueno, esto funciona!
user919426
87
SELECT * FROM INFORMATION_SCHEMA.TABLES 

O

SELECT * FROM Sys.Tables
StingyJack
fuente
55
Solo una nota de que (como se menciona en otras respuestas) sys.tables solo está disponible en 2005 en adelante
Rob
2
Lo que no es un problema en 2018. Creo que esto debería ser mayor :-)
Michal B.
29
USE YourDBName
GO 
SELECT *
FROM sys.Tables
GO

O

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

SQL Server 2012

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

(SQL Server 2000 estándar; todavía compatible con SQL Server 2005.)

devio
fuente
7

select * from sysobjects where xtype='U'

Spoulson
fuente
6
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U' 
Erikk Ross
fuente
SELECT name FROM sysobjects WHERE xtype='U' AND name <> 'sysdiagrams'; porque la tabla sysdiagrams, aunque creada por Microsoft SQL Server Management Studio, técnicamente no es una tabla del sistema, sino una que generalmente nos gusta excluir de todos modos.
Christoph
5

La desventaja INFORMATION_SCHEMA.TABLESes que también incluye tablas del sistema como dtpropertiesy las MSpeer_...tablas, sin forma de distinguirlas de sus propias tablas.

Recomendaría usar sys.objects(la nueva versión de la vista obsoleta de sysobjects ), que admite excluir las tablas del sistema:

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

En SSMS, para obtener todos los nombres de tabla totalmente calificados en una base de datos específica (por ejemplo, "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
fuente
2

Por favor use esto. Obtendrá nombres de tabla junto con nombres de esquema:

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

Gracias a Ray Vega, cuya respuesta da todas las tablas de usuario en una base de datos ...

exec sp_msforeachtable 'print' '?' ''

sp_helptext muestra la consulta subyacente, que resume a ...

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 
Franco
fuente
1

Bueno, puede usar sys.objects para obtener todos los objetos de la base de datos.

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

O

--  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
fuente
0
--for oracle
select tablespace_name, table_name from all_tables;

Este enlace puede proporcionar mucha más información sobre este tema.

Demietra95
fuente
2
Esto no es para SQL Server, por lo que no es una respuesta a esta pregunta.
Dan Getz
0

El uso SELECT * FROM INFORMATION_SCHEMA.COLUMNStambién le muestra todas las tablas y columnas relacionadas.

Masoud Darvishian
fuente