Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Разлика между sys.objects, sys.system_objects и sys.all_objects в SQL Server

Ако сте използвали T-SQL известно време, вероятно сте срещнали sys.objects изглед на системния каталог, който връща дефинирани от потребителя обекти с обхват на схема в базата данни.

Но има две други подобни възгледи, за които може да сте наясно или не; sys.system_objects и sys.all_objects .

Макар и подобни, разликите им са ясни, а имената казват разликата. Ето официалната дефиниция и за трите изгледа:

sys.objects
Съдържа ред за всеки дефиниран от потребителя обект с обхват на схема, който е създаден в база данни.
sys.system_objects
Съдържа един ред за всички системни обекти с обхват на схемата, които са включени в SQL Server.
sys.all_objects
Показва UNION на всички дефинирани от потребителя обекти и системни обекти с обхват на схема.

С други думи, последният изглед комбинира резултатите от предишните два изгледа (връща както системни и дефинирани от потребителя обекти).

Пример

Ето пример, който демонстрира разликата в резултатите, върнати от тези изгледи.

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

Резултат:

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

Тези изгледи връщат твърде много редове, за да ги изброя тук, така че използвам COUNT() за да върне броя на редовете, които всеки връща.

Ако сте добър в математиката, бързо ще видите, че броят на sys.all_objects е сумата от sys.objects и sys.system_objects .

Ето заявка, която прави това допълнение.

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

Резултат:

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

Имайте предвид, че видимостта на метаданните в изгледите на каталога е ограничена до защитени елементи, които потребителят притежава или за които потребителят е получил някакво разрешение.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Показатели за производителност на SQL сървъра, за да останете пред играта

  2. Как да върнете стойността на ASCII кода за даден знак в SQL Server

  3. OLTP в паметта:Какво е новото в SQL Server 2016

  4. Лоши навици:Избягване на NULL в SQL Server

  5. Как да вмъкна байт[] в колона VARBINARY на SQL сървър