In SQL Server puoi usare sys.sql_expression_dependencies
vista del catalogo di sistema per restituire tutte le dipendenze su un'entità definita dall'utente nel database corrente. Ciò include le dipendenze tra le funzioni scalari definite dall'utente compilate in modo nativo e altri moduli di SQL Server.
Puoi utilizzare questa visualizzazione per:
- Restituire entità che dipendono da una determinata entità
- Entità di ritorno da cui dipende una determinata entità
Quindi, ad esempio, puoi usarlo per restituire tutti gli oggetti che fanno riferimento a una tabella specifica. Puoi anche usarlo per restituire tutti gli oggetti a cui fa riferimento una specifica procedura memorizzata all'interno del suo codice.
In particolare, le sys.sql_expression_dependencies
visualizzare le informazioni sulle dipendenze dei rapporti per le seguenti entità:
- Entità legate allo schema.
- Entità non legate allo schema.
- Entità cross-database e cross-server. I nomi delle entità sono riportati; tuttavia, gli ID entità non vengono risolti.
- Dipendenze a livello di colonna da entità associate allo schema. Le dipendenze a livello di colonna per oggetti non associati a schemi possono essere restituite utilizzando sys.dm_sql_referenced_entities.
- DDL a livello di server si attiva nel contesto del database master.
Esempio 1 – Tutte le colonne restituite
Ecco un rapido esempio che seleziona tutte le colonne da sys.sql_expression_dependencies
. Questo ci mostra quali dati vengono effettivamente restituiti nella vista e possiamo utilizzare una qualsiasi di queste colonne nelle nostre query per restituire solo i dati che ci interessano.
SELECT TOP(1) * FROM sys.sql_expression_dependencies;
Risultato (usando l'output verticale):
referencing_id | 114099447 referencing_minor_id | 0 referencing_class | 1 referencing_class_desc | OBJECT_OR_COLUMN is_schema_bound_reference | 0 referenced_class | 1 referenced_class_desc | OBJECT_OR_COLUMN referenced_server_name | NULL referenced_database_name | NULL referenced_schema_name | dbo referenced_entity_name | Client referenced_id | 434100587 referenced_minor_id | 0 is_caller_dependent | 0 is_ambiguous | 0
Questo esempio utilizza l'output verticale in modo da semplificare la visualizzazione dei nomi delle colonne senza dover scorrere orizzontalmente. Pertanto, i nomi delle colonne sono elencati a sinistra ei rispettivi valori sono a destra.
Inoltre, per brevità ho usato TOP(1)
per limitare i risultati solo alla prima riga.
Esempio 2 – Trova entità che dipendono da un'entità
Per trovare oggetti che dipendono da una determinata entità, utilizza il referencing_id
di tale entità quando si seleziona dalla vista.
Esempio:
SELECT referenced_server_name AS [Referenced Server], referenced_database_name AS [Referenced DB], referenced_schema_name AS [Referenced Schema], referenced_entity_name AS [Referenced Entity], referenced_class_desc AS [Referenced Entity Class] FROM sys.sql_expression_dependencies WHERE referencing_id = OBJECT_ID('uspGetClient');
Risultato:
+---------------------+-----------------+---------------------+---------------------+---------------------------+ | Referenced Server | Referenced DB | Referenced Schema | Referenced Entity | Referenced Entity Class | |---------------------+-----------------+---------------------+---------------------+---------------------------| | NULL | NULL | dbo | Client | OBJECT_OR_COLUMN | | NULL | NULL | NULL | clientcode | TYPE | +---------------------+-----------------+---------------------+---------------------+---------------------------+
Qui ottengo tutte le entità a cui si fa riferimento in uspGetClient
procedura memorizzata.
Ecco la definizione effettiva di uspGetClient
:
CREATE PROCEDURE [dbo].[uspGetClient] @ClientCode clientcode AS SELECT FirstName, LastName FROM [dbo].[Client] WHERE ClientCode = @ClientCode;
Quindi possiamo vedere che seleziona i dati da una tabella chiamata Client
e accetta un argomento chiamato @ClientCode
con un tipo di dati (alias definito dall'utente) di clientcode
.
Esempio 3 – Trova entità da cui dipende un'entità
Puoi anche cambiarlo e ottenere gli oggetti da cui dipende una determinata entità. Per farlo, usa referenced_id
(invece di referencing_id
) quando si seleziona dalla vista.
Esempio:
SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity], OBJECT_NAME(referencing_minor_id) AS [Referencing Minor Entity], referencing_class_desc AS [Class], COL_NAME(referenced_id, referenced_minor_id) AS [Column] FROM sys.sql_expression_dependencies WHERE referenced_id = OBJECT_ID('Client');
Risultato:
+----------------------+----------------------------+------------------+------------+ | Referencing Entity | Referencing Minor Entity | Class | Column | |----------------------+----------------------------+------------------+------------| | uspGetClient | NULL | OBJECT_OR_COLUMN | NULL | | uspGetOrdersByClient | NULL | OBJECT_OR_COLUMN | NULL | | chkClientCode | NULL | OBJECT_OR_COLUMN | ClientCode | +----------------------+----------------------------+------------------+------------+
In questo esempio volevo vedere quali entità dipendono dal Client
tabella (ovvero quali entità fanno riferimento a quella tabella nel loro codice SQL).
Noterai che ho selezionato anche colonne diverse. Questo perché sto cercando informazioni sui riferimenti entità, non il riferito entità come nell'esempio precedente.
Esempio 4:recuperare ulteriori informazioni
È possibile unire questa visualizzazione con altre visualizzazioni e/o tabelle per restituire ulteriori informazioni.
Ad esempio, puoi unirti con sys.objects
per ottenere il tipo di oggetto di riferimento:
SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity], o.type_desc AS [Type], COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column], referenced_entity_name AS [Referenced Entity], COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column] FROM sys.sql_expression_dependencies AS sed INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id WHERE referenced_id = OBJECT_ID(N'Client');
Risultato:
+----------------------+----------------------+----------+---------------------+------------+ | Referencing Entity | Type | Column | Referenced Entity | Column | |----------------------+----------------------+----------+---------------------+------------| | uspGetClient | SQL_STORED_PROCEDURE | (n/a) | Client | (n/a) | | uspGetOrdersByClient | SQL_STORED_PROCEDURE | (n/a) | Client | (n/a) | | chkClientCode | CHECK_CONSTRAINT | (n/a) | Client | ClientCode | +----------------------+----------------------+----------+---------------------+------------+
In questo esempio ho anche aggiunto il COALESCE()
funzione per restituire (n/a)
ogni volta che referencing_minor_id
è NULL
. Questa funzione è uno dei tanti modi in cui puoi sostituire un valore NULL con una stringa in SQL Server.
Esempio 5 – Entità tra database e server multipli
Come accennato, sql_expression_dependencies
funziona anche su entità cross-database e cross-server. Tuttavia, in questo caso, i nomi delle entità vengono segnalati ma gli ID entità non vengono risolti.
Questo esempio utilizza esattamente lo stesso codice dell'esempio 2, tranne che questa volta è per un'entità diversa. Questa volta, voglio trovare entità che dipendono da uspGetAlbumsByArtist
:
SELECT referenced_server_name AS [Referenced Server], referenced_database_name AS [Referenced DB], referenced_schema_name AS [Referenced Schema], referenced_entity_name AS [Referenced Entity], referenced_class_desc AS [Referenced Entity Class] FROM sys.sql_expression_dependencies WHERE referencing_id = OBJECT_ID('uspGetAlbumsByArtist');
Risultato:
+---------------------+-----------------+---------------------+---------------------+---------------------------+ | Referenced Server | Referenced DB | Referenced Schema | Referenced Entity | Referenced Entity Class | |---------------------+-----------------+---------------------+---------------------+---------------------------| | Homer | Music | dbo | Albums | OBJECT_OR_COLUMN | +---------------------+-----------------+---------------------+---------------------+---------------------------+
In questo esempio, il server di riferimento e il database di riferimento hanno un valore (invece di essere NULL come nell'esempio precedente). Questo perché uspGetAlbumsByArtist
stored procedure utilizza un nome in quattro parti per fare riferimento all'entità su un server collegato (la stored procedure dell'esempio precedente non utilizzava un nome in quattro parti e non utilizzava nemmeno un nome in tre parti per specificare il DB) .
In questo esempio, Homer
è il nome del server collegato e Music
è il database interrogato dalla procedura memorizzata.
Possiamo vederlo in uspGetAlbumsByArtist
's definizione:
CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [Homer].[Music].[dbo].[Albums] WHERE ArtistId = @ArtistId;
Documentazione ufficiale
Per informazioni ed esempi più dettagliati, vedere sys.sql_expression_dependencies
sul sito Web Microsoft.
Ecco un altro articolo Microsoft che include istruzioni per ottenere le dipendenze tramite SSMS.