¿Cuál es la mejor manera de obtener los nombres de todas las tablas en una base de datos específica en SQL Server?
SHOW TABLES
(como se usa en MySQL)?
¿Cuál es la mejor manera de obtener los nombres de todas las tablas en una base de datos específica en SQL Server?
SHOW TABLES
(como se usa en MySQL)?
Respuestas:
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'
WHERE TABLE_TYPE='BASE TABLE'
solo incluirá tablas base (y, por extensión, siempre podría usar WHERE TABLE_TYPE != 'VIEW'
).
AND name <> 'sysdiagrams'
.
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U'
Aquí hay una lista de otros tipos de objetos que puede buscar también:
SELECT name FROM sysobjects WHERE xtype = 'U'
haría lo mismo.
'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!
USE YourDBName
GO
SELECT *
FROM sys.Tables
GO
O
USE YourDBName
GO
SELECT * FROM INFORMATION_SCHEMA.TABLES
GO
SELECT * FROM information_schema.tables
where TABLE_TYPE = 'BASE TABLE'
SQL Server 2012
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U'
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.
La desventaja INFORMATION_SCHEMA.TABLES
es que también incluye tablas del sistema como dtproperties
y 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
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:
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
ORDER BY TABLE_NAME
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
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
El uso SELECT * FROM INFORMATION_SCHEMA.COLUMNS
también le muestra todas las tablas y columnas relacionadas.