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ì?
SHOW TABLES
(như được sử dụng trong MySQL) có hoạt động không?
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ì?
SHOW TABLES
(như được sử dụng trong MySQL) có hoạt động không?
Câu trả lời:
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'
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'
).
AND name <> 'sysdiagrams'
.
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:
SELECT name FROM sysobjects WHERE xtype = 'U'
sẽ làm điều tương tự.
'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!
USE YourDBName
GO
SELECT *
FROM sys.Tables
GO
HOẶC LÀ
USE YourDBName
GO
SELECT * FROM INFORMATION_SCHEMA.TABLES
GO
SELECT * FROM information_schema.tables
where TABLE_TYPE = 'BASE TABLE'
Máy chủ SQL 2012
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.
Nhược điểm của INFORMATION_SCHEMA.TABLES
nó là nó cũng bao gồm các bảng hệ thống như dtproperties
và 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
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ả:
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
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
ORDER BY TABLE_NAME
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
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
--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
Sử dụng SELECT * FROM INFORMATION_SCHEMA.COLUMNS
cũng cho bạn thấy tất cả các bảng và các cột liên quan.