sql >> Databasteknik >  >> RDS >> Sqlserver

Skillnaden mellan sys.objects, sys.system_objects och sys.all_objects i SQL Server

Om du har använt T-SQL ett tag är det troligt att du har stött på sys.objects systemkatalogvy, som returnerar användardefinierade objekt med schemaomfattning i databasen.

Men det finns två andra liknande synpunkter som du kanske eller kanske inte är medveten om; sys.system_objects och sys.all_objects .

Även om de är lika, är skillnaderna tydliga, och namnen säger skillnaden. Här är den officiella definitionen av alla tre vyerna:

sys.objects
Innehåller en rad för varje användardefinierat objekt med schemaomfattning som skapas i en databas.
sys.system_objects
Innehåller en rad för alla systemobjekt med schemaomfattning som ingår i SQL Server.
sys.all_objects
Visar UNION av alla schemaomfattade användardefinierade objekt och systemobjekt.

Med andra ord, den sista vyn kombinerar resultaten från de två föregående vyn (den returnerar både system och användardefinierade objekt).

Exempel

Här är ett exempel som visar skillnaden i resultat som returneras av dessa vyer.

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

Resultat:

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

Dessa vyer returnerar för många rader för att jag ska kunna lista dem här, så jag använder COUNT() för att returnera antalet rader som var och en returnerar.

Om du är bra på matematik kommer du snabbt att se att antalet sys.all_objects är summan av sys.objects och sys.system_objects .

Här är en fråga som gör det tillägget.

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

Resultat:

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

Observera att synligheten av metadata i katalogvyer är begränsad till säkerhetsobjekt som en användare antingen äger eller som användaren har fått viss behörighet till.


  1. Är det nödvändigt att kassera DbCommand efter användning?

  2. Bästa databasfälttyp för en URL

  3. ORA-12154 kunde inte lösa den angivna anslutningsidentifieraren

  4. SELECT max(x) returnerar null; hur kan jag få det att returnera 0?