sql >> Database teknologi >  >> RDS >> Sqlserver

Forskellen mellem sys.objects, sys.system_objects og sys.all_objects i SQL Server

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.


  1. Konverter Datetime-kolonnen fra UTC til lokal tid i select statement

  2. WHERE IN-tilstand accepterer ikke strengværdi

  3. Hvad skal du kigge efter, hvis din PostgreSQL-replikering halter

  4. Genereret værdi i Postgres