Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Różnica między sys.objects, sys.system_objects i sys.all_objects w programie SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. czy można wybrać bezpośrednio jako bit?

  2. Problem z tabelą tymczasową RODBC podczas łączenia się z MS SQL Server

  3. Rozciągnij bazę danych w SQL Server 2016 RTM

  4. Czy można użyć `SqlDbType.Structured` do przekazywania parametrów wycenianych w tabeli w NHibernate?

  5. Utwórz tabelę tymczasową w SQL Server