Làm cách nào để có được danh sách tất cả các bảng trong cơ sở dữ liệu bằng TSQL?


895

Cách tốt nhất để lấy tên của tất cả các bảng trong cơ sở dữ liệu cụ thể trên SQL Server là gì?




3
Liệu SHOW TABLES(như được sử dụng trong MySQL) có hoạt động không?
Martin Thoma

Câu trả lời:


1429

SQL Server 2000, 2005, 2008, 2012, 2014, 2016, 2017 hoặc 2019:

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

Để chỉ hiển thị các bảng từ một cơ sở dữ liệu cụ thể

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

Hoặc là,

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

PS: Đối với SQL Server 2000:

SELECT * FROM sysobjects WHERE xtype='U' 

46
Xin lưu ý rằng điều này cũng sẽ bao gồm XEM, không chỉ các bảng
Nathan Koop

17
Thêm tên cơ sở dữ liệu nếu bạn không sử dụng cơ sở dữ liệu cụ thể, vì vậy nó sẽ CHỌN TABLE_NAME TỪ <DATABASE_NAME> .INFORMATION_SCHema.Tables
Shriroop

22
Việc thêm WHERE TABLE_TYPE='BASE TABLE'sẽ chỉ bao gồm các bảng cơ sở (và bằng phần mở rộng bạn luôn có thể sử dụng WHERE TABLE_TYPE != 'VIEW').
Phillip Copley

3
"Sysdiagrams" cũng xuất hiện trong danh sách này :(
celsowm

4
sysdiagrams là một bảng bình thường, bạn luôn phải loại trừ nó bằng tay với a AND name <> 'sysdiagrams'.
Christoph

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

Dưới đây là danh sách các loại đối tượng khác mà bạn có thể tìm kiếm:

  • AF: Hàm tổng hợp (CLR)
  • C: ràng buộc KIỂM TRA
  • D: Ràng buộc mặc định hoặc DEFAULT
  • F: ràng buộc KEY NGOẠI TỆ
  • L: Nhật ký
  • FN: Hàm vô hướng
  • FS: Hàm vô hướng (CLR)
  • Hàm có giá trị bảng FT: hội (CLR)
  • NẾU: Hàm trong bảng
  • CNTT: Bảng nội bộ
  • P: Thủ tục lưu trữ
  • PC: Thủ tục lưu trữ hội (CLR)
  • PK: Ràng buộc CHÍNH CHÍNH (loại là K)
  • RF: Thủ tục lưu trữ bộ lọc sao chép
  • S: Bảng hệ thống
  • SN: Từ đồng nghĩa
  • SQ: Hàng đợi dịch vụ
  • TA: Kích hoạt DML hội (CLR)
  • TF: Hàm bảng
  • TR: Trình kích hoạt DML SQL
  • TT: Kiểu bảng
  • U: Bảng người dùng
  • UQ: Ràng buộc ĐỘC ĐÁO (loại là K)
  • V: Xem
  • X: Thủ tục lưu trữ mở rộng

9
Bí danh là một chút dư thừa: SELECT name FROM sysobjects WHERE xtype = 'U'sẽ làm điều tương tự.
PJSCopeland

Cảm ơn, ban đầu tôi đã cố gắng này với nhiều câu chọn cho PK,FK,D,C,V,UQvv để so sánh mã nguồn và cơ sở dữ liệu mục tiêu, nhưng sau đó tôi tìm thấy này tính năng trong VS, nhưng là có không phải là một sql queryso sánh nguồn đầy đủ và cơ sở dữ liệu mục tiêu?
shaijut

Người ta tự hỏi tại sao 'U'được sử dụng để xác định Bảng người dùng ... trái ngược với có thể 'UT'hoặc, trực quan nhất, 'T'... À, cái này hoạt động!
dùng919426

87
SELECT * FROM INFORMATION_SCHEMA.TABLES 

HOẶC LÀ

SELECT * FROM Sys.Tables

5
Chỉ cần lưu ý rằng (như đã đề cập trong các câu trả lời khác) sys.tables chỉ khả dụng vào năm 2005 trở đi
Rob

2
Đó không phải là một vấn đề trong năm 2018. Tôi nghĩ rằng điều này nên cao hơn :-)
Michal B.

29
USE YourDBName
GO 
SELECT *
FROM sys.Tables
GO

HOẶC LÀ

USE YourDBName
GO
SELECT * FROM INFORMATION_SCHEMA.TABLES 
GO

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

Máy chủ SQL 2012



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

(Tiêu chuẩn SQL Server 2000; vẫn được hỗ trợ trong SQL Server 2005.)



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

SELECT name FROM sysobjects WHERE xtype='U' AND name <> 'sysdiagrams'; bởi vì bảng sysdiagrams mặc dù được tạo bởi Microsoft SQL Server Management Studio về mặt kỹ thuật không phải là bảng hệ thống mà chúng ta thường muốn loại trừ bằng mọi cách.
Christoph

5

Nhược điểm của INFORMATION_SCHEMA.TABLESnó là nó cũng bao gồm các bảng hệ thống như dtpropertiesvà các MSpeer_...bảng, không có cách nào để phân biệt chúng với các bảng của riêng bạn.

Tôi sẽ khuyên bạn nên sử dụng sys.objects(phiên bản mới của chế độ xem sysobjects không dùng nữa ), hỗ trợ loại trừ các bảng hệ thống:

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

2

Trong SSMS, để có được tất cả các tên bảng đủ điều kiện trong cơ sở dữ liệu cụ thể (Ví dụ: "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]

Các kết quả:

  • MyDatabase.dbo.MyTable1
  • MyDatabase.dbo.MyTable2
  • MyDatabase.MySchema.MyTable3
  • MyDatabase.MySchema.MyTable4
  • Vân vân.

2

Hãy sử dụng cái này. Bạn sẽ nhận được tên bảng cùng với tên lược đồ:

SELECT SYSSCHEMA.NAME, SYSTABLE.NAME
FROM SYS.tables SYSTABLE
INNER JOIN SYS.SCHEMAS SYSSCHEMA
ON SYSTABLE.SCHEMA_ID = SYSSCHEMA.SCHEMA_ID


1

Cảm ơn Ray Vega, người có phản hồi cung cấp cho tất cả các bảng người dùng trong cơ sở dữ liệu ...

thực hiện sp_msforeachtable 'in' '?' ''

sp_helptext hiển thị truy vấn cơ bản, tóm tắt thành ...

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

Vâng, bạn có thể sử dụng sys.objects để lấy tất cả các đối tượng cơ sở dữ liệu.

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

HOẶC LÀ

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

Liên kết này có thể cung cấp nhiều thông tin hơn về chủ đề này


2
Đây không phải là cho SQL Server, vì vậy không phải là một câu trả lời cho câu hỏi này.
Dan Getz

0

Sử dụng SELECT * FROM INFORMATION_SCHEMA.COLUMNScũng cho bạn thấy tất cả các bảng và các cột liên quan.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.