如何使用TSQL获取数据库中所有表的列表?

在SQL Server的特定数据库中获取所有表的名称的最佳方法是什么?

SQL Server 2005,2008,2012,2014或2016:

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

仅显示来自特定数据库的表格

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

要么,

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

PS:对于SQL Server 2000:

 SELECT * FROM sysobjects WHERE xtype='U' 
 SELECT sobjects.name FROM sysobjects sobjects WHERE sobjects.xtype = 'U' 

以下是您可以search的其他对象types的列表:

  • AF:聚合函数(CLR)
  • C:CHECK约束
  • D:默认或DEFAULT约束
  • F:FOREIGN KEY约束
  • L:日志
  • FN:标量函数
  • FS:汇编(CLR)标量函数
  • FT:汇编(CLR)表值函数
  • IF:内联表函数
  • IT:内部表
  • P:存储过程
  • PC:程序集(CLR)存储过程
  • PK:PRIMARY KEY约束(types是K)
  • RF:复制filter存储过程
  • S:系统表
  • SN:同义词
  • SQ:服务队列
  • TA:程序集(CLR)DML触发器
  • TF:表函数
  • TR:SQL DML触发器
  • TT:表格types
  • U:用户表
  • UQ:UNIQUE约束(types是K)
  • V:查看
  • X:扩展存储过程
 SELECT * FROM INFORMATION_SCHEMA.TABLES 

要么

 SELECT * FROM Sys.Tables 
 select * from sys.tables; 

要么

 SELECT * FROM INFORMATION_SCHEMA.TABLES 

要么

 SELECT * FROM sysobjects WHERE xtype='U' 
 USE YourDBName GO SELECT * FROM sys.Tables GO 
 exec sp_msforeachtable 'print ''?''' 
 SELECT * FROM information_schema.tables where TABLE_TYPE = 'BASE TABLE' 

SQL Server 2012

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

(SQL Server 2000标准;仍然在SQL Server 2005中受支持)

select * from sysobjects where xtype='U'

 SELECT sobjects.name FROM sysobjects sobjects WHERE sobjects.xtype = 'U' 

INFORMATION_SCHEMA.TABLES的缺点是它也包含了系统表(如dtpropertiesMSpeer_...表),无法将它们与您自己的表区分开来。

我build议使用sys.objects (不推荐使用的sysobjects视图的新版本),它支持排除系统表:

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

你可以简单地select你的数据库

 use database_name; 

然后input

 show tables; 

在SSMS中,要获取特定数据库中的所有完全限定的表名(例如“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] 

结果:

  • MyDatabase.dbo.MyTable1
  • MyDatabase.dbo.MyTable2
  • MyDatabase.MySchema.MyTable3
  • MyDatabase.MySchema.MyTable4
  • 等等
 --for oracle select tablespace_name, table_name from all_tables; 

此链接可以提供有关此主题的更多信息

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

感谢Ray Vega,他的回应给出了数据库中的所有用户表。

exec sp_msforeachtable'print''?'''

sp_helptext显示底层查询,其中总结到…

 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