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

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

2043745 次浏览
exec sp_msforeachtable 'print ''?'''

select * from sysobjects where xtype='U'

SELECT nameFROM sysobjectsWHERE xtype='U'ORDER BY name;

(SQLServer 2000标准;SQLServer 2005仍然支持。

SELECT sobjects.nameFROM sysobjects sobjectsWHERE sobjects.xtype = 'U'
SELECT * FROM INFORMATION_SCHEMA.TABLES

SELECT * FROM Sys.Tables

SQLServer 2000、2005、2008、2012、2014、2016、2017或2019:

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

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

SELECT TABLE_NAMEFROM [<DATABASE_NAME>].INFORMATION_SCHEMA.TABLESWHERE TABLE_TYPE = 'BASE TABLE'

或者,

SELECT TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE TABLE_TYPE = 'BASE TABLE'AND TABLE_CATALOG='dbName' --(for MySql, use: TABLE_SCHEMA='dbName' )

PS:对于SQLServer 2000:

SELECT * FROM sysobjects WHERE xtype='U'
SELECT sobjects.nameFROM sysobjects sobjectsWHERE sobjects.xtype = 'U'

以下是您也可以搜索的其他对象类型的列表:

  • AF:聚合函数(CLR)
  • C: CHECK约束
  • D:默认或默认约束
  • F:外键约束
  • L:原木
  • FN:标量函数
  • FS:汇编(CLR)标量函数
  • FT:汇编(CLR)表值函数
  • IF:内联表函数
  • IT:内部表
  • P:存储过程
  • PC:汇编(CLR)存储过程
  • PK:主键约束(类型为K)
  • RF:复制过滤器存储过程
  • S:系统表
  • SN:同义词
  • SQ:服务队列
  • TA:汇编(CLR)DML触发器
  • TF:表功能
  • TR:SQLDML触发器
  • TT:桌子类型
  • U:用户表
  • UQ:唯一约束(类型为K)
  • V:查看
  • X:扩展存储过程
SELECT * FROM information_schema.tableswhere TABLE_TYPE = 'BASE TABLE'

SQLServer 2012

USE YourDBNameGOSELECT *FROM sys.TablesGO

USE YourDBNameGOSELECT * FROM INFORMATION_SCHEMA.TABLESGO
--for oracleselect tablespace_name, table_name from all_tables;

这个链接可以提供更多的信息主题

SELECT TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE TABLE_TYPE='BASE TABLE'ORDER BY TABLE_NAME

感谢Ray Vega,他的响应提供了数据库中的所有用户表…

sp_msforeachtable打印 ''?'''

sp_helptext显示了底层查询,它总结为…

select * from dbo.sysobjects ojoin sys.all_objects syso on o.id =  syso.object_idwhere OBJECTPROPERTY(o.id, 'IsUserTable') = 1and o.category & 2 = 0

INFORMATION_SCHEMA.TABLES的缺点是它还包括系统表,例如dtpropertiesMSpeer_...表,无法将它们与您自己的表区分开来。

我建议使用sys.objects(已弃用的系统对象视图的新版本),它确实支持排除系统表:

select *from sys.objectswhere type = 'U'      -- User tablesand is_ms_shipped = 0 -- Exclude system tables

在SSMS中,要获取特定数据库(例如“MyDatabase”)中的所有完全限定的表名:

SELECT [TABLE_CATALOG] + '.' + [TABLE_SCHEMA] + '.' + [TABLE_NAME]FROM   MyDatabase.INFORMATION_SCHEMA.TablesWHERE  [TABLE_TYPE] = 'BASE TABLE' and [TABLE_NAME] <> 'sysdiagrams'ORDER BY [TABLE_SCHEMA], [TABLE_NAME]

结果:

  • MyDatabase.dbo.MyTable1
  • MyDatabase.dbo.MyTable2
  • 我的数据库。我的模式。我的表3
  • 我的数据库。我的模式。我的表4

请使用这个。您将获得表名称和模式名称:

SELECT SYSSCHEMA.NAME, SYSTABLE.NAMEFROM SYS.tables SYSTABLEINNER JOIN SYS.SCHEMAS SYSSCHEMAON SYSTABLE.SCHEMA_ID = SYSSCHEMA.SCHEMA_ID

使用SELECT * FROM INFORMATION_SCHEMA.COLUMNS还可以显示所有表和相关列。

您可以使用sys.objects来获取所有数据库对象。

 GOselect * from sys.objects where type_desc='USER_TABLE' order by nameGO

--  For all tablesselect * from INFORMATION_SCHEMA.TABLESGO
--- For user defined tablesselect * from INFORMATION_SCHEMA.TABLES where TABLE_TYPE='BASE TABLE'GO
--- For Viewsselect * from INFORMATION_SCHEMA.TABLES where TABLE_TYPE='VIEW'GO

要删除复制添加的表和Microsoft添加的任何其他表,请运行以下命令:

SELECT s.NAME SchemaName, t.NAME TableNameFROM [dbname].SYS.tables tINNER JOIN [dbname].SYS.SCHEMAS sON t.SCHEMA_ID = s.SCHEMA_IDWHERE t.is_ms_shipped=0 and type_desc = 'USER_TABLE'ORDER BY s.NAME, t.NAME
Any of the T-SQL code below will work in SQL Server 2019:
-- here, you need to prefix the database name in INFORMATION_SCHEMA.TABLESSELECT TABLE_NAME FROM [MSSQL-TEST].INFORMATION_SCHEMA.TABLES;
-- The next 2 ways will require you to point-- to the specific database you want to list the tables
USE [MSSQL-TEST];-- (1) Using sys.tablesSELECT * FROM sys.tables;
-- (2) Using sysobjectsSELECT * FROM sysobjectsWHERE type='U';
Here’s a working example using [Skyvia] using sys.tables.
[Skyvia] should be the link to https://skyvia.com/connectors/sql-server

[1]: https://i.stack.imgur.com/o3qo9.png

输入图片描述

Your SQL GUI tool should also have a way to list down all the tables in a database like the one above.
So, whatever suits your need and taste, there’s a code or GUI tool for that.

2022年更新:您可以在微软SQL服务器中使用此简单查询列表/展示创建的表。

select * from SYS.TABLES;