In SQL Server können Sie die sys.sql_expression_dependencies
verwenden Systemkatalogansicht, um alle Abhängigkeiten von einer benutzerdefinierten Entität in der aktuellen Datenbank zurückzugeben. Dazu gehören Abhängigkeiten zwischen nativ kompilierten, benutzerdefinierten Skalarfunktionen und anderen SQL Server-Modulen.
Sie können diese Ansicht für Folgendes verwenden:
- Entitäten zurückgeben, die von einer bestimmten Entität abhängen
- Entitäten zurückgeben, von denen eine bestimmte Entität abhängt
Sie könnten damit beispielsweise alle Objekte zurückgeben, die auf eine bestimmte Tabelle verweisen. Sie können es auch verwenden, um alle Objekte zurückzugeben, auf die eine bestimmte gespeicherte Prozedur in ihrem Code verweist.
Insbesondere die sys.sql_expression_dependencies
Anzeigen von Berichtsabhängigkeitsinformationen für die folgenden Entitäten:
- Schemagebundene Entitäten.
- Nicht schemagebundene Entitäten.
- Datenbank- und serverübergreifende Entitäten. Entitätsnamen werden gemeldet; Entitäts-IDs werden jedoch nicht aufgelöst.
- Abhängigkeiten auf Spaltenebene von schemagebundenen Entitäten. Abhängigkeiten auf Spaltenebene für nicht schemagebundene Objekte können mithilfe von sys.dm_sql_referenced_entities. zurückgegeben werden
- DDL-Trigger auf Serverebene im Kontext der Master-Datenbank.
Beispiel 1 – Alle Spalten zurückgegeben
Hier ist ein kurzes Beispiel, das alle Spalten aus sys.sql_expression_dependencies
auswählt . Dies zeigt uns, welche Daten tatsächlich in der Ansicht zurückgegeben werden, und wir können jede dieser Spalten in unseren Abfragen verwenden, um nur die Daten zurückzugeben, an denen wir interessiert sind.
SELECT TOP(1) * FROM sys.sql_expression_dependencies;
Ergebnis (bei vertikaler Ausgabe):
Referenz-ID | 114099447referencing_minor_id | 0referenzierungsklasse | 1referencing_class_desc | OBJECT_OR_COLUMNis_schema_bound_reference | 0referenzierte_Klasse | 1referenced_class_desc | OBJECT_OR_COLUMNreferenzierter_Servername | NULLreferenzierter_Datenbankname | NULLreferenzierter_Schemaname | dboreferenced_entity_name | Clientreferenzierte_id | 434100587referenced_minor_id | 0ist_anruferabhängig | 0ist_mehrdeutig | 0
Dieses Beispiel verwendet eine vertikale Ausgabe, um die Spaltennamen besser sehen zu können, ohne horizontal scrollen zu müssen. Daher werden die Spaltennamen auf der linken Seite und ihre jeweiligen Werte auf der rechten Seite aufgeführt.
Außerdem habe ich der Kürze halber TOP(1)
verwendet um die Ergebnisse auf die erste Zeile zu beschränken.
Beispiel 2 – Entitäten finden, die von einer Entität abhängen
Um Objekte zu finden, die von einer bestimmten Entität abhängen, verwenden Sie die referencing_id
dieser Entität bei der Auswahl aus der Ansicht.
Beispiel:
SELECT referenced_server_name AS [referenzierter Server], referenced_database_name AS [referenzierte Datenbank], referenced_schema_name AS [referenziertes Schema], referenced_entity_name AS [referenzierte Entität], referenced_class_desc AS [referenzierte Entitätsklasse] FROM sys.sql_expression_dependenciesWHERE referencing_id =OBJECT_ID('uspGetClient' );
Ergebnis:
+---------------------+-----------------+------ --------------------------------+------------ ---------------+| Referenzierter Server | Referenzierter DB | Referenziertes Schema | Referenzierte Entität | Referenzierte Entitätsklasse ||---------------------+----------------+----- -----------+---------------------+----------- ----------------|| NULL | NULL | dbo | Auftraggeber | OBJECT_OR_COLUMN || NULL | NULL | NULL | Kundencode | TYP |+---------------------+-----------------+------- --------------+---------------------+--------------------- --------------+
Hier bekomme ich alle Entitäten, die im uspGetClient
referenziert werden gespeicherte Prozedur.
Hier ist die eigentliche Definition für uspGetClient
:
CREATE PROCEDURE [dbo].[uspGetClient] @ClientCode Clientcode ASSELECT FirstName, LastNameFROM [dbo].[Client]WHERE ClientCode =@ClientCode;
Wir können also sehen, dass es Daten aus einer Tabelle namens Client
auswählt , und es akzeptiert ein Argument namens @ClientCode
mit einem (benutzerdefinierten Alias) Datentyp von clientcode
.
Beispiel 3 – Entitäten finden, von denen eine Entität abhängt
Sie können es auch umschalten und die Objekte abrufen, von denen eine bestimmte Entität abhängt. Verwenden Sie dazu referenced_id
(anstelle von referencing_id
) bei der Auswahl aus der Ansicht.
Beispiel:
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 [Spalte]FROM sys.sql_expression_dependenciesWHERE referenced_id =OBJECT_ID(' Kunde');
Ergebnis:
In diesem Beispiel wollte ich sehen, welche Entitäten vom Client
abhängen Tabelle (d. h. welche Entitäten referenzieren diese Tabelle in ihrem SQL-Code).
Sie werden feststellen, dass ich auch andere Spalten ausgewählt habe. Dies liegt daran, dass ich nach Informationen zur Referenzierung suche Entität, nicht die referenzierte Entität wie im vorherigen Beispiel.
Beispiel 4 – Weitere Informationen abrufen
Sie können diese Ansicht mit anderen Ansichten und/oder Tabellen verbinden, um weitere Informationen zurückzugeben.
Sie können es beispielsweise mit sys.objects
verknüpfen um den Typ des referenzierenden Objekts zu erhalten:
SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity], o.type_desc AS [Type], COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Spalte], referenced_entity_name AS [Referenced Entity] , COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Spalte]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' Kunde');
Ergebnis:
+---------------------+----------------------+ ----------------------+------------+| Referenzierende Entität | Geben Sie | ein Spalte | Referenzierte Entität | Spalte ||----------------------+---------------------+- ---------+---------------------+------------|| uspGetClient | SQL_STORED_PROCEDURE | (n/a) | Auftraggeber | (n/a) || uspGetOrdersByClient | SQL_STORED_PROCEDURE | (n/a) | Auftraggeber | (n/a) || chkClientCode | CHECK_CONSTRAINT | (n/a) | Auftraggeber | Kundencode |+----------------------+---------------------+- ---------+---------------------+------------+
In diesem Beispiel habe ich auch COALESCE()
hinzugefügt Funktion, um (n/a)
zurückzugeben wann immer referencing_minor_id
ist NULL
. Diese Funktion ist eine von mehreren Möglichkeiten, wie Sie in SQL Server einen NULL-Wert durch eine Zeichenfolge ersetzen können.
Beispiel 5 – Datenbank- und serverübergreifende Entitäten
Wie bereits erwähnt, sql_expression_dependencies
funktioniert auch auf datenbank- und serverübergreifenden Entitäten. In diesem Fall werden Entitätsnamen gemeldet, aber Entitäts-IDs werden nicht aufgelöst.
Dieses Beispiel verwendet genau denselben Code wie Beispiel 2, außer dass es diesmal für eine andere Entität gilt. Dieses Mal möchte ich Entitäten finden, die von uspGetAlbumsByArtist
abhängen :
SELECT referenced_server_name AS [Referenzierter Server], referenced_database_name AS [Referenzierte DB], referenced_schema_name AS [Referenziertes Schema], referenced_entity_name AS [Referenzierte Entität], referenced_class_desc AS [Referenzierte Entitätsklasse] FROM sys.sql_expression_dependenciesWHERE referencing_id =OBJECT_ID('uspGetAlbumsByArtist' );
Ergebnis:
+---------------------+-----------------+------ --------------------------------+------------ ---------------+| Referenzierter Server | Referenzierter DB | Referenziertes Schema | Referenzierte Entität | Referenzierte Entitätsklasse ||---------------------+----------------+----- -----------+---------------------+----------- ----------------|| Homer | Musik | dbo | Alben | OBJEKT_ODER_SPALTE |+---------------------+-----------------+------- --------------+---------------------+--------------------- --------------+
In diesem Beispiel haben der referenzierte Server und die referenzierte Datenbank einen Wert (anstatt NULL wie im vorherigen Beispiel zu sein). Das liegt daran, dass uspGetAlbumsByArtist
Die gespeicherte Prozedur verwendet einen vierteiligen Namen, um auf die Entität auf einem Verbindungsserver zu verweisen (die gespeicherte Prozedur aus dem vorherigen Beispiel verwendete keinen vierteiligen Namen und auch keinen dreiteiligen Namen, um die Datenbank anzugeben). .
In diesem Beispiel Homer
ist der Name des Verbindungsservers und Music
ist die Datenbank, die von der gespeicherten Prozedur abgefragt wird.
Wir können dies in uspGetAlbumsByArtist
sehen Definition:
CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int ASSELECT AlbumNameFROM [Homer].[Music].[dbo].[Albums]WHERE ArtistId =@ArtistId;
Offizielle Dokumentation
Ausführlichere Informationen und Beispiele finden Sie unter sys.sql_expression_dependencies
auf der Microsoft-Website.
Hier ist ein weiterer Microsoft-Artikel, der Anweisungen zum Abrufen von Abhängigkeiten über SSMS enthält.