I SQL Server kan du använda sys.sql_expression_dependencies systemkatalogvy för att returnera alla beroenden på en användardefinierad enhet i den aktuella databasen. Detta inkluderar beroenden mellan inbyggt kompilerade, skalära användardefinierade funktioner och andra SQL Server-moduler.
Du kan använda den här vyn för att:
- Returnera enheter som är beroende av en given enhet
- Returnera enheter som en given enhet är beroende av
Så till exempel kan du använda den för att returnera alla objekt som refererar till en specifik tabell. Du kan också använda den för att returnera alla objekt som en specifik lagrad procedur refererar till i sin kod.
Specifikt sys.sql_expression_dependencies visa rapportberoendeinformation för följande enheter:
- Schemabundna enheter.
- Icke-schemabundna enheter.
- Entiteter över databaser och servrar. Enhetsnamn rapporteras; enhets-ID:n löses dock inte.
- Beroenden på kolumnnivå av schemabundna enheter. Kolumnnivåberoenden för icke-schemabundna objekt kan returneras genom att använda sys.dm_sql_referenced_entities.
- DDL på servernivå utlöses när den är i huvuddatabasen.
Exempel 1 – Alla kolumner returnerade
Här är ett snabbt exempel som väljer alla kolumner från sys.sql_expression_dependencies . Detta visar oss vilken data som faktiskt returneras i vyn, och vi kan använda vilken som helst av dessa kolumner i våra frågor för att returnera bara den data vi är intresserade av.
SELECT TOP(1) * FROM sys.sql_expression_dependencies;
Resultat (med vertikal utdata):
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
Det här exemplet använder vertikal utdata för att göra det lättare att se kolumnnamnen utan att behöva rulla horisontellt. Därför listas kolumnnamnen till vänster och deras respektive värden är till höger.
För korthetens skull använde jag också TOP(1) för att begränsa resultaten till bara den första raden.
Exempel 2 – Hitta enheter som är beroende av en enhet
För att hitta objekt som är beroende av en given entitet, använd den entitetens referencing_id när du väljer från vyn.
Exempel:
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');
Resultat:
+---------------------+-----------------+---------------------+---------------------+---------------------------+ | Referenced Server | Referenced DB | Referenced Schema | Referenced Entity | Referenced Entity Class | |---------------------+-----------------+---------------------+---------------------+---------------------------| | NULL | NULL | dbo | Client | OBJECT_OR_COLUMN | | NULL | NULL | NULL | clientcode | TYPE | +---------------------+-----------------+---------------------+---------------------+---------------------------+
Här får jag alla entiteter som refereras till i uspGetClient lagrad procedur.
Här är den faktiska definitionen för uspGetClient :
CREATE PROCEDURE [dbo].[uspGetClient] @ClientCode clientcode AS
SELECT
FirstName,
LastName
FROM [dbo].[Client]
WHERE ClientCode = @ClientCode;
Så vi kan se att den väljer data från en tabell som heter Client , och den accepterar ett argument som heter @ClientCode med en (användardefinierad alias) datatyp clientcode .
Exempel 3 – Hitta enheter som en enhet är beroende av
Du kan också växla runt det och få de objekt som en given enhet beror på. För att göra det, använd referenced_id (istället för referencing_id ) när du väljer från vyn.
Exempel:
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');
Resultat:
+----------------------+----------------------------+------------------+------------+ | 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 | +----------------------+----------------------------+------------------+------------+
I det här exemplet ville jag se vilka enheter som är beroende av Client tabell (dvs. vilka enheter som refererar till den tabellen i sin SQL-kod).
Du kommer att märka att jag också valde olika kolumner. Det beror på att jag letar efter information om referensen enhet, inte den refererade enhet som i föregående exempel.
Exempel 4 – Hämta mer information
Du kan ansluta den här vyn med andra vyer och/eller tabeller för att returnera mer information.
Du kan till exempel ansluta den med sys.objects för att få referensobjektets typ:
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');
Resultat:
+----------------------+----------------------+----------+---------------------+------------+ | 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 | +----------------------+----------------------+----------+---------------------+------------+
I det här exemplet lade jag också till COALESCE() funktion för att returnera (n/a) när referencing_minor_id är NULL . Denna funktion är ett av flera sätt du kan ersätta ett NULL-värde med en sträng i SQL Server.
Exempel 5 – Cross-Databas &Cross-Server Entities
Som nämnts, sql_expression_dependencies fungerar även på entiteter över databaser och servrar. I det här fallet rapporteras dock enhetsnamn men enhets-ID:n löses inte.
Det här exemplet använder exakt samma kod som i exempel 2, förutom att den här gången är för en annan enhet. Den här gången vill jag hitta enheter som är beroende av 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');
Resultat:
+---------------------+-----------------+---------------------+---------------------+---------------------------+ | Referenced Server | Referenced DB | Referenced Schema | Referenced Entity | Referenced Entity Class | |---------------------+-----------------+---------------------+---------------------+---------------------------| | Homer | Music | dbo | Albums | OBJECT_OR_COLUMN | +---------------------+-----------------+---------------------+---------------------+---------------------------+
I det här exemplet har den refererade servern och refererade databasen ett värde (istället för att vara NULL som i det tidigare exemplet). Det beror på att uspGetAlbumsByArtist lagrad procedur använder ett fyrdelat namn för att referera till enheten på en länkad server (den lagrade proceduren från det tidigare exemplet använde inte ett fyrdelat namn, och den använde inte heller ett tredelat namn för att specificera DB) .
I det här exemplet, Homer är namnet på den länkade servern och Music är databasen som den lagrade proceduren frågar efter.
Vi kan se detta i uspGetAlbumsByArtist definition:
CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [Homer].[Music].[dbo].[Albums] WHERE ArtistId = @ArtistId;
Officiell dokumentation
För mer detaljerad information och exempel, se sys.sql_expression_dependencies på Microsofts webbplats.
Här är en annan Microsoft-artikel som innehåller instruktioner för att få beroenden via SSMS.