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

Differenza tra sys.sql_modules, sys.system_sql_modules e sys.all_sql_modules in SQL Server

In SQL Server i sys.sql_modules , sys.system_sql_modules e sys.all_sql_modules le viste del catalogo di sistema restituiscono metadati sui moduli definiti dal linguaggio SQL in SQL Server.

Tuttavia, c'è una differenza tra loro.

Ecco la definizione ufficiale di ciascuna vista:

sys.sql_modules
Restituisce una riga per ogni oggetto che è un modulo definito dal linguaggio SQL in SQL Server, inclusa la funzione scalare definita dall'utente compilata in modo nativo. Gli oggetti di tipo P, RF, V, TR, FN, IF, TF e R hanno un modulo SQL associato. I valori predefiniti autonomi, gli oggetti di tipo D, hanno anche una definizione di modulo SQL in questa vista.
sys.system_sql_modules
Restituisce una riga per oggetto di sistema che contiene un modulo definito dal linguaggio SQL. Gli oggetti di sistema di tipo FN, IF, P, PC, TF, V hanno un modulo SQL associato.
sys.all_sql_modules
Restituisce l'unione di sys.sql_modules e sys.system_sql_modules .

In altre parole, l'ultima vista combina i risultati delle due viste precedenti (restituisce sia il sistema che moduli definiti dall'utente).

Esempio

Ecco un esempio che dimostra la differenza nei risultati restituiti da queste visualizzazioni.

USE Music;

SELECT COUNT(*) AS sql_modules
FROM sys.sql_modules;

SELECT COUNT(*) AS system_sql_modules
FROM sys.system_sql_modules;

SELECT COUNT(*) AS all_sql_modules
FROM sys.all_sql_modules;

Risultato:

+---------------+
| sql_modules   |
|---------------|
| 9             |
+---------------+
(1 row affected)
+----------------------+
| system_sql_modules   |
|----------------------|
| 2020                 |
+----------------------+
(1 row affected)
+-------------------+
| all_sql_modules   |
|-------------------|
| 2029              |
+-------------------+
(1 row affected)

In questo caso, ci sono solo 9 moduli definiti dall'utente in questo database. Il resto proviene dai moduli di sistema.

Se aggiungiamo insieme i risultati delle prime due query, otteniamo lo stesso risultato di sys.all_sql_modules :

SELECT 
(SELECT COUNT(*) FROM sys.sql_modules) +
(SELECT COUNT(*) FROM sys.system_sql_modules)
AS Result;

Risultato:

+----------+
| Result   |
|----------|
| 2029     |
+----------+