Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Unterschied zwischen sys.objects, sys.system_objects und sys.all_objects in SQL Server

Wenn Sie T-SQL eine Zeit lang verwendet haben, sind Sie wahrscheinlich auf die sys.objects gestoßen Systemkatalogansicht, die benutzerdefinierte, schemabezogene Objekte in der Datenbank zurückgibt.

Aber es gibt zwei andere ähnliche Ansichten, die Ihnen vielleicht bekannt sind oder nicht; sys.system_objects und sys.all_objects .

Obwohl sie ähnlich sind, sind ihre Unterschiede deutlich und die Namen sagen den Unterschied aus. Hier ist die offizielle Definition aller drei Ansichten:

sys.objects
Enthält eine Zeile für jedes benutzerdefinierte Objekt im Schemabereich, das in einer Datenbank erstellt wird.
sys.system_objects
Enthält eine Zeile für alle schemabezogenen Systemobjekte, die in SQL Server enthalten sind.
sys.all_objects
Zeigt die UNION aller schemabezogenen benutzerdefinierten Objekte und Systemobjekte.

Mit anderen Worten, die letzte Ansicht kombiniert die Ergebnisse der beiden vorherigen Ansichten (sie gibt sowohl system als auch zurück benutzerdefinierte Objekte).

Beispiel

Hier ist ein Beispiel, das den Unterschied in den Ergebnissen zeigt, die von diesen Ansichten zurückgegeben werden.

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

Ergebnis:

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

Diese Ansichten geben zu viele Zeilen zurück, um sie hier aufzulisten, also verwende ich COUNT() um die Anzahl der Zeilen zurückzugeben, die jeder zurückgibt.

Wenn Sie gut in Mathe sind, werden Sie schnell feststellen, dass die Anzahl der sys.all_objects ist die Summe von sys.objects und sys.system_objects .

Hier ist eine Abfrage, die diese Addition durchführt.

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

Ergebnis:

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

Beachten Sie, dass die Sichtbarkeit der Metadaten in Katalogansichten auf sicherungsfähige Elemente beschränkt ist, die ein Benutzer entweder besitzt oder für die dem Benutzer eine gewisse Berechtigung erteilt wurde.