Quelle est la meilleure façon d'obtenir les noms de toutes les tables d'une base de données spécifique sur SQL Server?
SHOW TABLES
-ce que (comme utilisé dans MySQL) fonctionne?
Quelle est la meilleure façon d'obtenir les noms de toutes les tables d'une base de données spécifique sur SQL Server?
SHOW TABLES
-ce que (comme utilisé dans MySQL) fonctionne?
Réponses:
SQL Server 2000, 2005, 2008, 2012, 2014, 2016, 2017 ou 2019:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'
Pour afficher uniquement les tables d'une base de données particulière
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: Pour SQL Server 2000:
SELECT * FROM sysobjects WHERE xtype='U'
WHERE TABLE_TYPE='BASE TABLE'
n'inclura que les tables de base (et par extension, vous pourrez toujours les utiliser WHERE TABLE_TYPE != 'VIEW'
).
AND name <> 'sysdiagrams'
.
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U'
Voici une liste d'autres types d'objets que vous pouvez également rechercher:
SELECT name FROM sysobjects WHERE xtype = 'U'
ferait la même chose.
'U'
est utilisé pour identifier la table utilisateur ... par opposition à peut 'UT'
- être ou, la plus intuitive, 'T'
... Ah bon, ça marche!
USE YourDBName
GO
SELECT *
FROM sys.Tables
GO
OU
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';
car la table sysdiagrams, bien que créée par Microsoft SQL Server Management Studio, n'est techniquement pas une table système mais une que nous aimons généralement exclure de toute façon.
L'inconvénient INFORMATION_SCHEMA.TABLES
est qu'il comprend également des tables système telles que dtproperties
et les MSpeer_...
tables, sans aucun moyen de les distinguer de vos propres tables.
Je recommanderais d'utiliser sys.objects
(la nouvelle version de la vue sysobjects obsolète ), qui prend en charge l'exclusion des tables système:
select *
from sys.objects
where type = 'U' -- User tables
and is_ms_shipped = 0 -- Exclude system tables
Dans SSMS, pour obtenir tous les noms de table complets dans une base de données spécifique (par exemple, "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]
Résultats:
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
ORDER BY TABLE_NAME
Merci à Ray Vega, dont la réponse donne toutes les tables d'utilisateurs dans une base de données ...
exec sp_msforeachtable 'print' '?' ''
sp_helptext montre la requête sous-jacente, qui se résume à ...
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
Eh bien, vous pouvez utiliser sys.objects pour obtenir tous les objets de base de données.
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
L'utilisation SELECT * FROM INFORMATION_SCHEMA.COLUMNS
vous montre également toutes les tables et colonnes associées.