Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Sự khác biệt giữa sys.objects, sys.system_objects và sys.all_objects trong SQL Server

Nếu bạn đã sử dụng T-SQL một thời gian, có thể bạn đã gặp phải sys.objects chế độ xem danh mục hệ thống, trả về các đối tượng trong phạm vi lược đồ, do người dùng xác định trong cơ sở dữ liệu.

Nhưng có hai quan điểm tương tự khác mà bạn có thể nhận thức được hoặc không; sys.system_objectssys.all_objects .

Mặc dù giống nhau, nhưng sự khác biệt của chúng rất rõ ràng, và những cái tên đã nói lên sự khác biệt. Đây là định nghĩa chính thức cho cả ba chế độ xem:

sys.objects
Chứa một hàng cho mỗi đối tượng phạm vi lược đồ, do người dùng xác định, được tạo trong cơ sở dữ liệu.
sys.system_objects
Chứa một hàng cho tất cả các đối tượng hệ thống phạm vi lược đồ được bao gồm trong SQL Server.
sys.all_objects
Hiển thị UNION của tất cả các đối tượng do người dùng xác định trong phạm vi lược đồ và đối tượng hệ thống.

Nói cách khác, chế độ xem cuối cùng kết hợp các kết quả của hai chế độ xem trước đó (nó trả về cả hệ thống đối tượng do người dùng xác định).

Ví dụ

Dưới đây là một ví dụ chứng minh sự khác biệt về kết quả do các chế độ xem này trả về.

USE WideWorldImportersDW;

SELECT COUNT(*) AS [sys.objects]
FROM sys.objects;

SELECT COUNT(*) AS [sys.system_objects]
FROM sys.system_objects;

SELECT COUNT(*) AS [sys.all_objects]
FROM sys.all_objects;

SELECT 
  (SELECT COUNT(*) AS [sys.all_objects] FROM sys.all_objects) - 
  (SELECT COUNT(*) AS [sys.system_objects] FROM sys.system_objects) 
AS [sys.all_objects MINUS sys.system_objects];

Kết quả:

+---------------+
| sys.objects   |
|---------------|
| 224           |
+---------------+
(1 row affected)
+----------------------+
| sys.system_objects   |
|----------------------|
| 2205                 |
+----------------------+
(1 row affected)
+-------------------+
| sys.all_objects   |
|-------------------|
| 2429              |
+-------------------+
(1 row affected)

Các chế độ xem này trả về quá nhiều hàng khiến tôi không thể liệt kê chúng ở đây, vì vậy tôi đang sử dụng COUNT() để trả về số hàng mà mỗi hàng trả về.

Nếu bạn giỏi toán, bạn sẽ nhanh chóng thấy rằng số lượng sys.all_objects là tổng của sys.objectssys.system_objects .

Đây là một truy vấn thực hiện việc bổ sung đó.

SELECT 
  (SELECT COUNT(*) AS [sys.objects] FROM sys.objects) + 
  (SELECT COUNT(*) AS [sys.system_objects] FROM sys.system_objects) 
AS [sys.objects PLUS sys.system_objects];

Kết quả:

+---------------------------------------+
| sys.objects PLUS sys.system_objects   |
|---------------------------------------|
| 2429                                  |
+---------------------------------------+

Lưu ý rằng khả năng hiển thị của siêu dữ liệu trong các chế độ xem danh mục bị giới hạn đối với các bảo mật mà người dùng sở hữu hoặc người dùng đã được cấp một số quyền.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Máy chủ SQL bỏ qua trường hợp trong một biểu thức where

  2. Sử dụng FILEGROUP_ID () để trả về ID của nhóm tệp trong SQL Server

  3. Xóa các hàng trùng lặp (dựa trên giá trị từ nhiều cột) khỏi bảng SQL

  4. Tạo mảng JSON lồng nhau bằng FOR JSON PATH

  5. ListAGG trong SQLSERVER