sys.sql_dependencias_de_expresiones (Transact-SQL)

Se aplica a:punto de conexión de SQL Server Azure SQL Instancia administrada el punto de conexión de SQL Analytics Analytics Platform System (PDW) de SQL Analytics system (PDW) de SQL Server en Microsoft FabricWarehouse en Microsoft Fabric

Contiene una fila para cada dependencia por nombre en una entidad definida por el usuario en la base de datos actual. Esto incluye dependencias entre funciones escalares definidas por el usuario y otras funciones escalares compiladas de forma nativa y otros módulos de SQL Server. Se crea una dependencia entre dos entidades cuando una entidad, llamada entidad a la que se hace referencia, aparece por nombre en una expresión de SQL persistente de otra entidad, llamada entidad que hace la referencia. Por ejemplo, si en la definición de una vista se hace referencia a una tabla, la vista, como entidad que hace la referencia, depende de la tabla, la entidad a la que se hace referencia. Si desapareciera la tabla, la vista sería inservible.

Para obtener más información, vea Funciones escalares definidas por el usuario para OLTP en memoria.

Puede utilizar esta vista de catálogo para notificar información de dependencia de las entidades siguientes:

  • Entidades enlazadas a un esquema.

  • Entidades no enlazadas a un esquema.

  • Entidades entre servidores y entre bases de datos. Se reportan los nombres de las entidades; sin embargo, los IDs de las entidades no se resuelven.

  • Dependencias de nivel de columna en entidades enlazadas a un esquema. Se pueden devolver las dependencias de nivel de columna de los objetos no enlazados a un esquema mediante sys.dm_sql_referenced_entities.

  • El DDL a nivel de servidor se activa cuando está en el contexto de la master base de datos.

Nombre de la columna Tipo de datos Descripción
referencing_id int Identificador de la entidad que hace la referencia. No es anulable.
referencing_minor_id int Identificador de la columna cuando la entidad de referencia es una columna; en caso contrario, es 0. No es anulable.
referencing_class tinyint Clase de la entidad que hace la referencia.

1 = Objeto o columna
12 = Disparador DDL de base de datos
13 = Disparador DDL del servidor

No es anulable.
referencing_class_desc nvarchar(60) Descripción de la clase de la entidad que hace la referencia.

OBJECT_OR_COLUMN
DATABASE_DDL_TRIGGER
SERVER_DDL_TRIGGER

No es anulable.
is_schema_bound_reference bit 1 = La entidad referenciada está limitada al esquema.
0 = La entidad referenciada no está ligada al esquema.

No es anulable.
referenced_class tinyint Clase de la entidad a la que se hace referencia.

1 = Objeto o columna
6 = Tipo
7 = Índice
10 = Colección de esquemas XML
21 = Función de partición

No es anulable.
referenced_class_desc nvarchar(60) Descripción de la clase de la entidad a la que se hace referencia.

OBJECT_OR_COLUMN
TYPE
INDEX
XML_SCHEMA_COLLECTION
PARTITION_FUNCTION

No es anulable.
referenced_server_name sysname Nombre del servidor de la entidad a la que se hace referencia.

Esta columna se rellena para las dependencias entre servidores especificadas con un nombre de cuatro partes válido. Para más información sobre los nombres con varias partes, consulte Convenciones de sintaxis de Transact-SQL.

NULL para entidades no vinculadas a esquemas para las que se hizo referencia sin especificar un nombre de cuatro partes.

NULL para entidades limitadas al esquema porque deben estar en la misma base de datos y, por tanto, solo pueden definirse usando un nombre de dos partes (schema.object).
referenced_database_name sysname Nombre de la base de datos de la entidad a la que se hace referencia.

Esta columna se rellena para las referencias entre bases de datos o entre servidores especificadas con un nombre válido de tres o cuatro partes.

NULL para referencias no vinculadas al esquema cuando se especifican usando un nombre de una o dos partes.

NULLpara entidades limitadas por el esquema porque deben estar en la misma base de datos y, por tanto, solo pueden definirse usando un esquema de dos partes (esquema).nombre).
referenced_schema_name sysname Esquema al que pertenece la entidad a la que se hace referencia.

NULL para referencias no vinculadas al esquema en las que la entidad fue referenciada sin especificar el nombre del esquema.

Nunca NULL para referencias limitadas a esquemas porque las entidades delimitadas por esquema deben definirse y referenciarse usando un nombre de dos partes.
referenced_entity_name sysname Nombre de la entidad a la que se hace referencia. No es anulable.
referenced_id int Identificador de la entidad a la que se hace referencia. El valor de esta columna nunca NULL corresponde a referencias vinculadas a esquemas. El valor de esta columna es siempre NULL para referencias entre servidores y bases de datos.

NULL para referencias dentro de la base de datos si no se puede determinar el ID. Para referencias no vinculadas al esquema, el ID no puede resolverse en los siguientes casos:

La entidad referenciada no existe en la base de datos.

El esquema de la entidad a la que se hace referencia depende del esquema del autor de la llamada y se resuelve en tiempo de ejecución. En este caso, is_caller_dependent se establece en 1.
referenced_minor_id int Identificador de la columna a la que se hace referencia cuando la entidad que hace la referencia es una columna; en caso contrario, es 0. No es anulable.

Una entidad a la que se hace referencia es una columna cuando una columna se identifica mediante un nombre en la entidad de referencia o cuando la entidad primaria se usa en una instrucción SELECT *.
is_caller_dependent bit Indica que el enlace de esquema de la entidad a la que se hace referencia se realiza en tiempo de ejecución; por consiguiente, la resolución del identificador de la entidad depende del esquema del autor de la llamada. Esto se produce cuando la entidad a la que se hace referencia es un procedimiento almacenado, un procedimiento almacenado extendido o una función definida por el usuario no enlazada a un esquema llamada en una instrucción EXECUTE.

1 = La entidad referenciada depende del llamador y se resuelve en tiempo de ejecución. En este caso, referenced_id es NULL.

0 = El ID de la entidad referenciado no depende del llamador.

Es siempre 0 para las referencias enlazadas a esquema y para las referencias entre bases de datos o entre servidores que especifican explícitamente un nombre de esquema. Por ejemplo, una referencia a una entidad en el formato EXEC MyDatabase.MySchema.MyProc no depende del llamador. Sin embargo, una referencia con el formato EXEC MyDatabase..MyProc es dependiente del autor de la llamada.
is_ambiguous bit Indica que la referencia es ambigua y puede resolverse en tiempo de ejecución a una función definida por el usuario, un tipo definido por el usuario (UDT) o una referencia XQuery a una columna de tipo xml.

Por ejemplo, suponga que la instrucción SELECT Sales.GetOrder() FROM Sales.MySales está definida en un procedimiento almacenado. Hasta que se ejecute el procedimiento almacenado, no se sabe si Sales.GetOrder() es una función definida por el usuario en el Sales esquema o columna llamada Sales UDT con un método llamado GetOrder().

1 = La referencia es ambigua.

0 = La referencia es inequívoca o la entidad puede ser vinculada con éxito cuando se llama a la vista.

Siempre es 0 para las referencias enlazadas a un esquema.

Observaciones

La tabla siguiente enumera los tipos de entidades para las que se crea y mantiene la información de dependencia. La información de dependencias no se crea ni mantiene para reglas, valores predeterminados, tablas temporales, procedimientos almacenados temporales u objetos del sistema.

Nota:

Azure Synapse Analytics y Parallel Data Warehouse admiten tablas, vistas, estadísticas filtradas y los tipos de entidad de procedimientos almacenados de Transact-SQL de esta lista. La información de dependencia se crea y mantiene solo para tablas, vistas y estadísticas filtradas.

Tipo de entidad Entidad que hace la referencia Entidad a la que se hace referencia
Tabla 1
Ver
Índice filtrado 2 No
Estadísticas filtradas 2 No
Transact-SQL Procedimientoalmacenado 3
procedimiento almacenado CLR No
Función Transact-SQL definida por el usuario
Función CLR definida por el usuario No
Desencadenador CLR (DML y DDL) No No
Desencadenador DML de Transact-SQL No
Desencadenador DDL de nivel de la base de datos de Transact-SQL No
Desencadenador DDL de nivel de servidor de Transact-SQL No
Procedimientos almacenados extendidos No
Cola No
Synonym (Sinónimo) No
Tipo (tipo CLR y alias definido por el usuario) No
Colección de esquemas XML No
Función de partición No

1 Una tabla se rastrea como entidad de referencia solo cuando hace referencia a un módulo Transact-SQL, un tipo definido por el usuario o una colección de esquema XML en la definición de una columna computada, restricción CHECK o DEFAULT restricción.

2 Cada columna utilizada en el predicado del filtro se rastrea como una entidad de referencia.

3 Los procedimientos almacenados numerados con un valor entero mayor que 1 no se rastrean ni como entidad referenciada ni como entidad referenciada.

Permisos

Requiere VIEW permiso DEFINITION en la base de datos y permiso SELECT activado sys.sql_expression_dependencies para la base de datos. De forma predeterminada, solo se concede el permiso SELECT a los miembros del rol fijo de base de datos db_owner . Cuando se conceden permisos SELECT y VIEW DEFINITION a otro usuario, el receptor puede ver todas las dependencias de la base de datos.

Ejemplos

A. Devuelve entidades que son referenciadas por otra entidad

El ejemplo siguiente devuelve las tablas y columnas a las que se hace referencia en la vista Production.vProductAndDescription. La vista depende de las entidades (tablas y columnas) devueltas en referenced_entity_name y las columnas referenced_column_name.

USE AdventureWorks2022;
GO

SELECT
    OBJECT_NAME(referencing_id) AS referencing_entity_name,
    o.type_desc AS referencing_description,
    COALESCE (COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_minor_id,
    referencing_class_desc,
    referenced_server_name,
    referenced_database_name,
    referenced_schema_name,
    referenced_entity_name,
    COALESCE (COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS referenced_column_name,
    is_caller_dependent,
    is_ambiguous
FROM sys.sql_expression_dependencies AS sed
    INNER JOIN sys.objects AS o
        ON sed.referencing_id = o.object_id
WHERE referencing_id = OBJECT_ID(N'Production.vProductAndDescription');

B. Devuelven entidades que hacen referencia a otra entidad

El ejemplo siguiente devuelve las entidades que hacen referencia a la tabla Production.Product. Las entidades devueltas en la columna referencing_entity_name dependen de la tabla Product.

USE AdventureWorks2022;
GO

SELECT
    OBJECT_SCHEMA_NAME(referencing_id) AS referencing_schema_name,
    OBJECT_NAME(referencing_id) AS referencing_entity_name,
    o.type_desc AS referencing_description,
    COALESCE (COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_minor_id,
    referencing_class_desc,
    referenced_class_desc,
    referenced_server_name,
    referenced_database_name,
    referenced_schema_name,
    referenced_entity_name,
    COALESCE (COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS referenced_column_name,
    is_caller_dependent,
    is_ambiguous
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'Production.Product');

C. Devolver dependencias entre bases de datos

El siguiente ejemplo devuelve todas las dependencias entre bases de datos. El ejemplo crea primero la base de datos db1 y dos procedimientos almacenados que hacen referencia a tablas en las bases de datos db2 y db3. A continuación, se consulta la tabla sys.sql_expression_dependencies para crear informes de las dependencias entre bases de datos entre los procedimientos y las tablas. NULL se devuelve en la referenced_schema_name columna de la entidad t3 referenciada porque no se especifica un nombre de esquema para esa entidad en la definición del procedimiento.

CREATE DATABASE db1;
GO

USE db1;
GO

CREATE PROCEDURE p1 AS
SELECT * FROM db2.s1.t1;
GO

CREATE PROCEDURE p2 AS
UPDATE db3..t3
SET c1 = c1 + 1;
GO

SELECT
    OBJECT_NAME(referencing_id),
    referenced_database_name,
    referenced_schema_name,
    referenced_entity_name
FROM sys.sql_expression_dependencies
WHERE referenced_database_name IS NOT NULL;
GO

USE master;
GO

DROP DATABASE db1;