Hvis du har brugt T-SQL i et stykke tid, er det sandsynligt, at du har stødt på sys.objects
systemkatalogvisning, som returnerer brugerdefinerede, skema-omfattede objekter i databasen.
Men der er to andre lignende synspunkter, som du måske eller måske ikke er klar over; sys.system_objects
og sys.all_objects
.
Selvom de ligner hinanden, er deres forskelle tydelige, og navnene fortæller forskellen. Her er den officielle definition alle tre visninger:
sys.objects
- Indeholder en række for hvert brugerdefineret, skema-omfattet objekt, der oprettes i en database.
sys.system_objects
- Indeholder én række for alle skema-omfattede systemobjekter, der er inkluderet i SQL Server.
sys.all_objects
- Viser
UNION
af alle skema-omfattede brugerdefinerede objekter og systemobjekter.
Med andre ord, den sidste visning kombinerer resultaterne af de to foregående visninger (den returnerer både system og brugerdefinerede objekter).
Eksempel
Her er et eksempel, der viser forskellen i resultater, der returneres af disse visninger.
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)
Disse visninger returnerer for mange rækker til, at jeg kan liste dem her, så jeg bruger COUNT()
for at returnere antallet af rækker, som hver enkelt returnerer.
Hvis du er god til matematik, vil du hurtigt se, at antallet af sys.all_objects
er summen af sys.objects
og sys.system_objects
.
Her er en forespørgsel, der gør den tilføjelse.
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 | +---------------------------------------+
Bemærk, at metadataenes synlighed i katalogvisninger er begrænset til sikres, som en bruger enten ejer, eller som brugeren har fået en vis tilladelse til.