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


Answers:


1428

SQL Server 2000、2005、2008、2012、2014、2016、2017或2019:

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' 

46
请注意,这不仅包括表格,还包括视图
Nathan Koop

17
如果您不使用特定的数据库,请添加数据库名称,这样它将是<DATABASE_NAME>中的SELECTTABLE_NAME。INFORMATION_SCHEMA.Tables– Shriroop
2013年

22
添加WHERE TABLE_TYPE='BASE TABLE'将仅包括基表(通过扩展,您始终可以使用WHERE TABLE_TYPE != 'VIEW')。
菲利普·科普利2014年

3
“ sysdiagrams”也出现在此列表中:(
celsowm 2014年

4
sysdiagrams是一个普通表,您始终必须使用手动将其排除AND name <> 'sysdiagrams'
Christoph

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

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

  • AF:汇总功能(CLR)
  • C:检查约束
  • D:默认或默认约束
  • F:外键约束
  • L:日志
  • FN:标量函数
  • FS:装配(CLR)标量函数
  • FT:程序集(CLR)表值函数
  • IF:内联表功能
  • IT:内部表
  • P:存储过程
  • PC:程序集(CLR)存储过程
  • PK:PRIMARY KEY约束(类型为K)
  • RF:复制过滤器存储过程
  • S:系统表
  • SN:同义词
  • SQ:服务队列
  • TA:装配(CLR)DML触发器
  • TF:表格功能
  • TR:SQL DML触发器
  • TT:表格类型
  • U:用户表
  • UQ:UNIQUE约束(类型为K)
  • V:检视
  • X:扩展存储过程

9
别名有点多余:SELECT name FROM sysobjects WHERE xtype = 'U'会做同样的事情。
PJSCopeland

谢谢,起初我尝试使用PK,FK,D,C,V,UQetc的多个select语句来比较源数据库和目标数据库,但是后来我在VS中发现了功能,但是没有一个sql query用于比较完整源数据库和目标数据库的功能吗?
shaijut 2015年

一个人想知道为什么'U'使用它来标识用户表……而不是也许'UT'是最直观的'T'……很好,这行得通!
user919426'3

87
SELECT * FROM INFORMATION_SCHEMA.TABLES 

要么

SELECT * FROM Sys.Tables

5
请注意(如在其他答案中所述)sys.tables仅在2005年以后可用
Rob

2
在2018年这不是问题。我认为这应该更高:-)
Michal

29
USE YourDBName
GO 
SELECT *
FROM sys.Tables
GO

要么

USE YourDBName
GO
SELECT * FROM INFORMATION_SCHEMA.TABLES 
GO



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

(SQL Server 2000标准; SQL Server 2005仍支持。)



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

SELECT name FROM sysobjects WHERE xtype='U' AND name <> 'sysdiagrams'; 因为sysdiagrams表虽然是由Microsoft SQL Server Management Studio创建的,但从技术上讲它不是系统表,但无论如何我们通常都希望排除该表。
Christoph

5

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

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

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

2

在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
  • 等等

2

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

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

感谢Ray Vega,他的回应为数据库中的所有用户表...

exec sp_msforeachtable'打印``?'''

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 

1

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

 GO
 select * from sys.objects where type_desc='USER_TABLE' order by name
 GO

要么

--  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;

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


2
这不适用于SQL Server,因此也不是此问题的答案。
Dan Getz

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.