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.