Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Differenza tra sys.objects, sys.system_objects e sys.all_objects in SQL Server

Se usi T-SQL da un po' di tempo, è probabile che tu abbia incontrato sys.objects vista del catalogo di sistema, che restituisce gli oggetti definiti dall'utente con ambito schema nel database.

Ma ci sono altri due punti di vista simili di cui potresti essere o meno a conoscenza; sys.system_objects e sys.all_objects .

Sebbene simili, le loro differenze sono chiare e i nomi dicono la differenza. Ecco la definizione ufficiale di tutte e tre le viste:

sys.objects
Contiene una riga per ogni oggetto definito dall'utente con ambito schema creato all'interno di un database.
sys.system_objects
Contiene una riga per tutti gli oggetti di sistema con ambito schema inclusi in SQL Server.
sys.all_objects
Mostra il UNION di tutti gli oggetti definiti dall'utente e gli oggetti di sistema con ambito schema.

In altre parole, l'ultima vista combina i risultati delle due viste precedenti (restituisce sia il sistema che oggetti definiti dall'utente).

Esempio

Ecco un esempio che dimostra la differenza nei risultati restituiti da queste visualizzazioni.

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

Risultato:

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

Queste visualizzazioni restituiscono troppe righe per poterle elencare qui, quindi sto usando COUNT() per restituire il numero di righe che ciascuna restituisce.

Se sei bravo in matematica, vedrai subito che il conteggio di sys.all_objects è la somma di sys.objects e sys.system_objects .

Ecco una query che fa quell'aggiunta.

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

Risultato:

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

Tieni presente che la visibilità dei metadati nelle viste del catalogo è limitata ai dispositivi a protezione diretta che un utente possiede o per i quali l'utente ha ottenuto un'autorizzazione.