sql >> Base de Datos >  >> RDS >> Sqlserver

Diferencia entre sys.objects, sys.system_objects y sys.all_objects en SQL Server

Si ha usado T-SQL por un tiempo, es probable que haya encontrado sys.objects vista de catálogo del sistema, que devuelve objetos de ámbito de esquema definidos por el usuario en la base de datos.

Pero hay otros dos puntos de vista similares de los que puede o no estar al tanto; sys.system_objects y sys.all_objects .

Aunque similares, sus diferencias son claras y los nombres dicen la diferencia. Aquí está la definición oficial de las tres vistas:

sys.objects
Contiene una fila para cada objeto de ámbito de esquema definido por el usuario que se crea dentro de una base de datos.
sys.system_objects
Contiene una fila para todos los objetos del sistema con ámbito de esquema que se incluyen con SQL Server.
sys.all_objects
Muestra la UNION de todos los objetos definidos por el usuario y objetos del sistema en el ámbito del esquema.

En otras palabras, la última vista combina los resultados de las dos vistas anteriores (devuelve tanto el sistema y objetos definidos por el usuario).

Ejemplo

Este es un ejemplo que demuestra la diferencia en los resultados devueltos por estas vistas.

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

Resultado:

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

Estas vistas devuelven demasiadas filas para enumerarlas aquí, así que estoy usando COUNT() para devolver el número de filas que devuelve cada uno.

Si eres bueno en matemáticas, verás rápidamente que el recuento de sys.all_objects es la suma de sys.objects y sys.system_objects .

Aquí hay una consulta que hace esa suma.

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

Resultado:

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

Tenga en cuenta que la visibilidad de los metadatos en las vistas de catálogo se limita a los elementos protegibles que son propiedad de un usuario o sobre los que se le ha otorgado algún permiso.