Jeśli używałeś T-SQL przez jakiś czas, prawdopodobnie napotkałeś sys.objects
widok katalogu systemowego, który zwraca zdefiniowane przez użytkownika obiekty o zakresie schematu w bazie danych.
Ale istnieją dwa inne podobne poglądy, o których możesz być świadomy lub nie; sys.system_objects
i sys.all_objects
.
Chociaż są podobne, ich różnice są wyraźne, a nazwy mówią różnicę. Oto oficjalna definicja wszystkich trzech widoków:
sys.objects
- Zawiera wiersz dla każdego zdefiniowanego przez użytkownika obiektu o zakresie schematu, który jest tworzony w bazie danych.
sys.system_objects
- Zawiera jeden wiersz dla wszystkich obiektów systemowych o zakresie schematu, które są zawarte w SQL Server.
sys.all_objects
- Pokazuje
UNION
wszystkich zdefiniowanych przez użytkownika obiektów i obiektów systemowych w zakresie schematu.
Innymi słowy, ostatni widok łączy wyniki dwóch poprzednich widoków (zwraca zarówno systemowe i obiekty zdefiniowane przez użytkownika).
Przykład
Oto przykład, który pokazuje różnicę w wynikach zwracanych przez te widoki.
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];
Wynik:
+---------------+ | sys.objects | |---------------| | 224 | +---------------+ (1 row affected) +----------------------+ | sys.system_objects | |----------------------| | 2205 | +----------------------+ (1 row affected) +-------------------+ | sys.all_objects | |-------------------| | 2429 | +-------------------+ (1 row affected)
Te widoki zwracają zbyt wiele wierszy, abym mógł je tutaj wymienić, więc używam COUNT()
aby zwrócić liczbę wierszy, które każdy z nich zwraca.
Jeśli jesteś dobry z matematyki, szybko zobaczysz, że liczba sys.all_objects
jest sumą sys.objects
i sys.system_objects
.
Oto zapytanie, które dodaje ten dodatek.
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];
Wynik:
+---------------------------------------+ | sys.objects PLUS sys.system_objects | |---------------------------------------| | 2429 | +---------------------------------------+
Zwróć uwagę, że widoczność metadanych w widokach katalogu jest ograniczona do zabezpieczeń, których użytkownik jest właścicielem lub do których użytkownik otrzymał pewne uprawnienia.