sql >> Database >  >> RDS >> Sqlserver

Verschil tussen sys.objects, sys.system_objects en sys.all_objects in SQL Server

Als u T-SQL al een tijdje gebruikt, bent u waarschijnlijk de sys.objects tegengekomen systeemcatalogusweergave, die door de gebruiker gedefinieerde, schemagerichte objecten in de database retourneert.

Maar er zijn twee andere soortgelijke opvattingen waarvan u zich misschien wel of niet bewust bent; sys.system_objects en sys.all_objects .

Hoewel ze vergelijkbaar zijn, zijn hun verschillen duidelijk, en de namen vertellen het verschil. Hier is de officiële definitie van alle drie de weergaven:

sys.objects
Bevat een rij voor elk door de gebruiker gedefinieerd object met schemabereik dat in een database wordt gemaakt.
sys.system_objects
Bevat één rij voor alle systeemobjecten met schemabereik die zijn opgenomen in SQL Server.
sys.all_objects
Toont de UNION van alle door de gebruiker gedefinieerde objecten en systeemobjecten met schemabereik.

Met andere woorden, de laatste weergave combineert de resultaten van de vorige twee weergaven (het retourneert zowel systeem en door de gebruiker gedefinieerde objecten).

Voorbeeld

Hier is een voorbeeld dat het verschil in resultaten van deze weergaven laat zien.

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

Resultaat:

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

Deze weergaven retourneren te veel rijen voor mij om ze hier op te sommen, dus ik gebruik COUNT() om het aantal rijen te retourneren dat elke rij retourneert.

Als je goed bent in wiskunde, zul je snel zien dat het aantal sys.all_objects is de som van sys.objects en sys.system_objects .

Hier is een zoekopdracht die die toevoeging doet.

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

Resultaat:

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

Houd er rekening mee dat de zichtbaarheid van de metadata in catalogusweergaven beperkt is tot beveiligbare bestanden die een gebruiker bezit of waarvoor de gebruiker enige toestemming heeft gekregen.


  1. Automatische gegevensverzameling over voltooide taken in MS SQL Server

  2. Hoe declareer en gebruik ik variabelen in PL/SQL zoals ik doe in T-SQL?

  3. JDBC versus webservice voor Android

  4. Bevriezen beheren in PostgreSQL