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


895

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?




3
Est SHOW TABLES-ce que (comme utilisé dans MySQL) fonctionne?
Martin Thoma

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' 

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

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

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

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

SQL Server 2012



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

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



6
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.
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

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.

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

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

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 

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

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

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


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.