Comment obtenir la liste de toutes les tables d'une base de données à l'aide de TSQL?

Réponses:

1429

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' 
ScottStonehouse
la source
46
Veuillez noter que cela inclura également les VUES, pas seulement les tableaux
Nathan Koop
17
Ajoutez le nom de la base de données si vous n'utilisez pas la base de données spécifique afin qu'elle soit SELECT TABLE_NAME FROM <DATABASE_NAME> .INFORMATION_SCHEMA.Tables
Shriroop
22
L'ajout WHERE TABLE_TYPE='BASE TABLE'n'inclura que les tables de base (et par extension, vous pourrez toujours les utiliser WHERE TABLE_TYPE != 'VIEW').
Phillip Copley
3
"sysdiagrams" apparaît aussi dans cette liste :(
celsowm
4
sysdiagrams est un tableau normal, vous devez toujours l'exclure manuellement avec un AND name <> 'sysdiagrams'.
Christoph
199
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U'

Voici une liste d'autres types d'objets que vous pouvez également rechercher:

  • AF: fonction d'agrégation (CLR)
  • C: contrainte CHECK
  • D: Contrainte par défaut ou DEFAUT
  • F: contrainte FOREIGN KEY
  • L: Journal
  • FN: fonction scalaire
  • FS: fonction scalaire d'assemblage (CLR)
  • FT: fonction table (CLR) assemblée
  • IF: fonction de table intégrée
  • IT: Table interne
  • P: Procédure stockée
  • PC: procédure stockée d'assemblage (CLR)
  • PK: contrainte PRIMARY KEY (le type est K)
  • RF: Procédure stockée du filtre de réplication
  • S: table système
  • SN: Synonyme
  • SQ: file d'attente de service
  • TA: déclencheur DML d'assemblage (CLR)
  • TF: fonction de table
  • TR: déclencheur SQL DML
  • TT: type de table
  • U: table utilisateur
  • UQ: contrainte UNIQUE (le type est K)
  • V: Voir
  • X: Procédure stockée étendue
Michée
la source
9
L'aliasing est un peu redondant: SELECT name FROM sysobjects WHERE xtype = 'U'ferait la même chose.
PJSCopeland
Merci, au départ, j'ai essayé cela avec plusieurs instructions de sélection pour PK,FK,D,C,V,UQetc pour comparer la base de données source et cible, mais j'ai trouvé cette fonctionnalité dans VS, mais n'y a-t-il pas sql queryde comparaison complète de la base de données source et cible?
shaijut
On se demande pourquoi 'U'est utilisé pour identifier la table utilisateur ... par opposition à peut 'UT'- être ou, la plus intuitive, 'T'... Ah bon, ça marche!
user919426
87
SELECT * FROM INFORMATION_SCHEMA.TABLES 

OU

SELECT * FROM Sys.Tables
StingyJack
la source
5
Juste une note que (comme mentionné dans d'autres réponses) sys.tables n'est disponible qu'à partir de 2005
Rob
2
Ce qui n'est pas un problème en 2018. Je pense que cela devrait être plus élevé :-)
Michal B.
29
USE YourDBName
GO 
SELECT *
FROM sys.Tables
GO

OU

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

SQL Server 2012

Rasoul Zabihi
la source
9
exec sp_msforeachtable 'print ''?'''
Rayon
la source
9
SELECT name 
FROM sysobjects 
WHERE xtype='U' 
ORDER BY name;

(SQL Server 2000 standard; toujours pris en charge dans SQL Server 2005.)

devio
la source
7

select * from sysobjects where xtype='U'

spoulson
la source
6
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U' 
Erikk Ross
la source
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.
Christoph
5

L'inconvénient INFORMATION_SCHEMA.TABLESest qu'il comprend également des tables système telles que dtpropertieset 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
Astrotrain
la source
2

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:

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

Veuillez utiliser ceci. Vous obtiendrez des noms de table ainsi que des noms de schéma:

SELECT SYSSCHEMA.NAME, SYSTABLE.NAME
FROM SYS.tables SYSTABLE
INNER JOIN SYS.SCHEMAS SYSSCHEMA
ON SYSTABLE.SCHEMA_ID = SYSSCHEMA.SCHEMA_ID
Vikash
la source
1
SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE='BASE TABLE' 
ORDER BY TABLE_NAME
Développeur
la source
1

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 
Franc
la source
1

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

Ce lien peut fournir beaucoup plus d'informations sur ce sujet

Demietra95
la source
2
Ce n'est pas pour SQL Server, ce n'est donc pas une réponse à cette question.
Dan Getz
0

L'utilisation SELECT * FROM INFORMATION_SCHEMA.COLUMNSvous montre également toutes les tables et colonnes associées.

Masoud Darvishian
la source