Ако сте използвали 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 | +---------------------------------------+
Имайте предвид, че видимостта на метаданните в изгледите на каталога е ограничена до защитени елементи, които потребителят притежава или за които потребителят е получил някакво разрешение.