Está en la página 1de 11

Implementar funciones definidas por el usuario

http://msdn.microsoft.com/es-es/library/ms179545.aspx

En esta sección, se ofrece información acerca de la creación, ejecución y visualización de funciones de Transact-SQL y CLR
definidas por el usuario.

En esta sección
Crear funciones definidas por el usuario (motor de base de datos)

Directrices para crear funciones de Transact-SQL definidas por el usuario.

Crear funciones CLR

Directrices para crear funciones CLR definidas por el usuario.

Crear funciones de agregado definidas por el usuario

Directrices para crear funciones de agregado CLR.

Ejecutar funciones definidas por el usuario (motor de base de datos)

Directrices para invocar funciones definidas por el usuario y del sistema.

Ver funciones definidas por el usuario

Directrices para ver metadatos y definiciones de funciones definidas por el usuario.

Crear funciones definidas por el usuario (motor de


base de datos)
http://msdn.microsoft.com/es-es/library/ms191320.aspx

Las funciones definidas por el usuario se crean con la instrucción CREATE FUNCTION, se modifican con la instrucción
ALTER FUNCTION y se quitan con la instrucción DROP FUNCTION. Los nombres completos de las funciones definidas por
el usuario (schema_name.function_name) deben ser únicos.

Directrices

Los errores de Transact-SQL que producen la cancelación de una instrucción y continúan con la siguiente instrucción del
módulo, como desencadenadores o procedimientos almacenados, se tratan de forma distinta dentro de una función. En
las funciones, estos errores hacen que se detenga la ejecución de la función. Esto hace que se cancele la función que
invocó la instrucción.

Las instrucciones de un bloque BEGIN...END no pueden producir efectos secundarios. Los efectos secundarios
de una función son cambios definitivos del estado de un recurso que está fuera del ámbito de la función, como
una modificación de una tabla de base de datos. Los únicos cambios que pueden realizar las instrucciones de la
función son cambios en objetos locales de la función, como cursores o variables locales. En una función no se

1
pueden llevar a cabo algunas acciones como, por ejemplo, modificar tablas de base de datos, realizar
operaciones en cursores no locales de la función, enviar correo electrónico, intentar modificar un catálogo o
generar un conjunto de resultados que se devuelve al usuario.

Nota
Si una instrucción CREATE FUNCTION genera efectos secundarios sobre recursos que no existen en el
momento que se emite la instrucción CREATE FUNCTION, SQL Server ejecuta la instrucción. Sin embargo,
SQL Server no ejecuta la función cuando ésta se invoca.

El número de veces que se ejecuta realmente una función especificada en una consulta puede variar entre los planes de
ejecución generados por el optimizador. Un ejemplo es una función invocada por una subconsulta en una cláusula
WHERE. El número de veces que se ejecuta la subconsulta y su función puede variar con diferentes rutas de acceso
seleccionadas por el optimizador.

Instrucciones válidas en una función

Entre los tipos de instrucciones válidos en una función se incluyen:

 Las instrucciones DECLARE pueden utilizarse para definir variables y cursores de datos locales de la función.
 La asignación de valores a objetos locales de la función, como la utilización de SET para asignar valores a variables
locales escalares y de tabla.

 Las operaciones de cursores que hacen referencia a cursores locales que están declarados, abiertos, cerrados y no
asignados en la función. No se admiten las instrucciones FETCH que devuelven datos al cliente. Sólo se permiten las
instrucciones FETCH que asignan valores a variables locales mediante la cláusula INTO.

 Instrucciones de control de flujo excepto instrucciones TRY...CATCH.

 Instrucciones SELECT que contienen listas de selección con expresiones que asignan valores a las variables locales
para la función.

 Instrucciones UPDATE, INSERT y DELETE que modifican las variables de tabla locales de la función.

 Instrucciones EXECUTE que llaman a un procedimiento almacenado extendido.

Funciones del sistema integradas

Las siguientes funciones integradas no deterministas se pueden usar en funciones Transact-SQL definidas por el
usuario.

CURRENT_TIMESTAMP @@MAX_CONNECTIONS

GET_TRANSMISSION_STATUS @@PACK_RECEIVED

GETDATE @@PACK_SENT

GETUTCDATE @@PACKET_ERRORS

2
@@CONNECTIONS @@TIMETICKS

@@CPU_BUSY @@TOTAL_ERRORS

@@DBTS @@TOTAL_READ

@@IDLE @@TOTAL_WRITE

@@IO_BUSY

Las siguientes funciones integradas no deterministas no se pueden usar en funciones Transact-SQL definidas
por el usuario.

NEWID RAND

NEWSEQUENTIALID TEXTPTR

Para consultar una lista de las funciones de sistema integradas deterministas y no deterministas, vea Funciones
deterministas y no deterministas.

Funciones enlazadas a esquemas

CREATE FUNCTION admite una cláusula SCHEMABINDING que enlaza la función con el esquema de cualquier objeto al
que haga referencia, como tablas, vistas y otras funciones definidas por el usuario. Se producen errores al intentar
modificar o quitar objetos a los que hace referencia una función enlazada con un esquema.

Para poder especificar SCHEMABINDING en CREATE FUNCTION deben cumplirse estas condiciones:

 Todas las vistas y las funciones definidas por el usuario a las que hace referencia la función deben estar enlazadas
con un esquema.
 Todos los objetos a los que hace referencia la función deben encontrarse en la misma base de datos que la
función. Se debe hacer referencia a los objetos mediante nombres de una o dos partes.

 Se debe disponer de permisos REFERENCES en todos los objetos (tablas, vistas y funciones definidas por el
usuario) a los que hace referencia la función.

Se puede utilizar ALTER FUNCTION para quitar el enlace con el esquema. La instrucción ALTER FUNCTION debe volver a
definir la función sin especificar WITH SCHEMABINDING.

Especificar parámetros

Una función definida por el usuario tiene de cero a varios parámetros de entrada y devuelve un valor escalar o una tabla.
Una función puede tener un máximo de 1024 parámetros de entrada. Cuando un parámetro de la función tiene un valor
predeterminado, debe especificarse la palabra clave DEFAULT al llamar a la función para poder obtener el valor
predeterminado. Este comportamiento es diferente del de los parámetros con valores predeterminados de
procedimientos almacenados definidos por el usuario, para los cuales omitir el parámetro implica especificar el valor
predeterminado. Las funciones definidas por el usuario no admiten parámetros de salida.

3
Crear funciones CLR
http://msdn.microsoft.com/es-es/library/ms189876.aspx

Es posible puede crear un objeto de base de datos dentro de una instancia de SQL Server programada en un ensamblado
creado en Common Language Runtime (CLR) de Microsoft.NET Framework. Los objetos de bases de datos capaces de
aprovechar el modelo enriquecido de programación suministrado por Common Language Runtime son las funciones de
agregado, las funciones, los procedimientos almacenados, los desencadenadores y los tipos.

Para crear una función CLR en SQL Server se deben seguir los pasos detallados a continuación:

 Definir la función como un método estático de una clase en un lenguaje admitido por .NET Framework. Para
obtener más información acerca de cómo programar funciones en Common Language Runtime, vea Funciones CLR
definidas por el usuario. A continuación, compilar la clase para generar un ensamblado en .NET Framework
mediante el compilador del lenguaje adecuado.
 Registrar el ensamblado en SQL Server mediante la instrucción CREATE ASSEMBLY. Para obtener más información
acerca de los ensamblados de SQL Server, veaEnsamblados (motor de base de datos).
 Crear la función que hace referencia al ensamblado registrado mediante la instrucción CREATE FUNCTION.

Nota
La implementación de un proyecto de SQL Server en MicrosoftVisual Studio registra un ensamblado en la
base de datos especificada para el proyecto. La implementación del proyecto también crea funciones CLR en
la base de datos para todos los métodos anotados con el atributo SqlFunction. Para obtener más información,
vea Implementar objetos de base de datos de CLR.

Nota
La capacidad de SQL Server para ejecutar el código CLR se encuentra desactivada de manera predeterminada.
Puede crear, modificar y quitar objetos de base de datos que hacen referencia a los módulos de códigos
administrados; sin embargo, estas referencias no se ejecutarán en SQL Server a menos que se haya habilitado
la opción clr enabled mediante sp_configure (Transact-SQL).

Obtener acceso a recursos externos

Las funciones CLR se pueden utilizar para obtener acceso a recursos externos tales como archivos, recursos de red,
servicios web y otras bases de datos (incluidas las instancias remotas de SQL Server). Para ello, es posible utilizar diversas
clases en .NET Framework, como por ejemplo System.IO, System.WebServices, System.Sql, etc. El ensamblado que
contiene estas funciones debe estar configurado por lo menos con el conjunto de permisos EXTERNAL_ACCESS que tiene
este objetivo. Para obtener más información, vea CREATE ASSEMBLY (Transact-SQL). El proveedor administrado cliente
SQL se puede utilizar para obtener acceso a instancias remotas de SQL Server. No obstante, las conexiones vinculadas en
bucles de retorno con el servidor de origen no están admitidas en las funciones CLR.

Para crear, modificar o quitar ensamblados de SQL Server

 CREATE ASSEMBLY (Transact-SQL)


 ALTER ASSEMBLY (Transact-SQL)
 DROP ASSEMBLY (Transact-SQL)

Para crear una función CLR

 CREATE FUNCTION (Transact-SQL)

4
Acceso a código nativo

Las funciones CLR se pueden utilizar para tener acceso a código nativo (no administrado), como el código escrito en C o
C++, a través del uso de PInvoke desde código administrado (vea Llamar a funciones nativas desde código
administrado para obtener detalles). Así, puede reutilizar el código heredado como las UDF de CLR, o escribir UDF
esenciales para el rendimiento en código nativo. Esto requiere usar un ensamblado UNSAFE. Vea Seguridad de acceso del
código de integración CLR para conocer advertencias acerca del uso de ensamblados UNSAFE.

Crear funciones de agregado definidas por el usuario


http://msdn.microsoft.com/es-es/library/ms190678.aspx

Es posible crear un objeto de base de datos en SQL Server programado en un ensamblado CLR.Los objetos de base de
datos que pueden aprovechar el completo modelo de programación que proporciona CLR incluyen desencadenadores,
procedimientos almacenados, funciones, funciones de agregado y tipos.

Al igual que las funciones de agregado integradas que proporciona Transact-SQL, las funciones de agregado definidas por
el usuario realizan un cálculo en un conjunto de valores y devuelven un único valor.

La creación de una función de agregado definida por el usuario en SQL Server implica estos pasos:

 Establecer la función de agregado definida por el usuario como una clase en un lenguaje de Microsoft compatible
con .NET Framework. Para obtener más información sobre la programación de funciones de agregado definidas por
el usuario en CRL, vea Agregados definidos por el usuario de CLR. Compile esta clase para generar un ensamblado
CRL con el compilador de lenguaje correspondiente.
 Registrar el ensamblado en SQL Server con la instrucción CREATE ASSEMBLY. Para obtener más información
acerca de los ensamblados de SQL Server, vea Ensamblados (motor de base de datos).
 Crear la función de agregado definida por el usuario que hace referencia al ensamblado registrado con la instrucción CREATE AGGREGATE.

Nota
La implementación de un proyecto de SQL Server en MicrosoftVisual Studio registra un ensamblado en la
base de datos especificada para el proyecto. La implementación del proyecto también crea un agregado
definido por el usuario en la base de datos para todas las definiciones de clase anotadas con el
atributo SqlUserDefinedAggregate. Para obtener más información, vea Implementar objetos de base de datos
de CLR.

Nota
La capacidad de SQL Server para ejecutar el código CLR se encuentra desactivada de manera predeterminada.
Puede crear, modificar y quitar objetos de base de datos que hacen referencia a los módulos de códigos
administrados; sin embargo, estas referencias no se ejecutarán en SQL Server a menos que se haya activado la
opción clr enabled mediante sp_configure (Transact-SQL).

Para crear, modificar o quitar un ensamblado

 CREATE ASSEMBLY (Transact-SQL)


 ALTER ASSEMBLY (Transact-SQL)
 DROP ASSEMBLY (Transact-SQL)

Para crear una función de agregado definida por el usuario

5
 CREATE AGGREGATE (Transact-SQL)

Ejecutar funciones definidas por el usuario (motor de


base de datos)
http://msdn.microsoft.com/es-es/library/ms175562.aspx

Las funciones definidas por el usuario se pueden invocar en consultas o en otras instrucciones o expresiones, como columnas calculadas o expresiones de cadena. Las funciones escalares se pueden ejecutar mediante la
instrucción EXECUTE.

Invocar funciones definidas por el usuario que devuelven un valor escalar

Puede invocar una función definida por el usuario que devuelve un valor escalar en cualquier parte de una expresión escalar del mismo tipo de datos que se permite en las instrucciones Transact-SQL. Las funciones escalares
deben invocarse como mínimo con el nombre de dos partes de la función. Para obtener más información sobre los nombres con varias partes, vea Convenciones de sintaxis de Transact-SQL (Transact-SQL).

Consultas

En estas ubicaciones se permiten funciones definidas por el usuario que devuelven valores escalares:

 Como expression de select_list de una instrucción SELECT:

USE AdventureWorks2008R2;
GO
SELECT ProductID, ListPrice, dbo.ufnGetProductDealerPrice(ProductID, StartDate) AS DealerPrice,
StartDate, EndDate
FROM Production.ProductListPriceHistory
WHERE ListPrice > .0000
ORDER BY ProductID, StartDate;
GO

 Como expression o string_expression en un predicado de cláusula WHERE o HAVING:

USE AdventureWorks2008R2;
GO
SELECT ProductID, ListPrice, StartDate, EndDate
FROM Production.ProductListPriceHistory
WHERE dbo.ufnGetProductDealerPrice(ProductID, StartDate) > .0000
ORDER BY ProductID, StartDate;
GO

 Como group_by_expression en una cláusula GROUP BY.

 Como order_by_expression en una cláusula ORDER BY.

 Como expression en la cláusula SET de una instrucción UPDATE:

USE AdventureWorks2008R2;
GO
UPDATE Production.ProductListPriceHistory
SET ListPrice = dbo.ufnGetProductDealerPrice(ProductID, StartDate)

6
WHERE ProductID > 900;
GO

 Como expression en la cláusula VALUES de una instrucción INSERT:

Las funciones definidas por el usuario a las que se hace referencia en estas ubicaciones se ejecutan lógicamente una vez por fila.

Restricciones CHECK

Las funciones definidas por el usuario que devuelven valores escalares se pueden invocar en restricciones CHECK si los valores de argumento transferidos a la función sólo hacen referencia a columnas o constantes en la
tabla. Cada vez que el procesador de consultas comprueba la restricción, el procesador de consultas llama a la función con los valores de argumento asociados a la fila que se está comprobando actualmente. El propietario
de una tabla también debe ser el propietario de la función definida por el usuario invocada por una restricción CHECK de una tabla.

Definiciones DEFAULT

Las funciones definidas por el usuario se pueden invocar como constant_expression de definiciones DEFAULT si los valores de argumentos transferidos a la función sólo contienen constantes. El propietario de la tabla
también debe ser el propietario de la función definida por el usuario invocada por una definición DEFAULT de una tabla.

Columnas calculadas

Es posible invocar funciones mediante columnas calculadas si los valores de argumentos transferidos a la función sólo hacen referencia a columnas o constantes de una tabla. El propietario de la tabla también debe ser el
propietario de la función definida por el usuario invocada por una columna calculada de una tabla.

Operadores de asignación

Los operadores de asignación (left_operand = right_operand) pueden invocar funciones definidas por el usuario que devuelven un valor escalar en la expresión especificada como operando derecho.

Instrucciones de control de flujo

Las funciones definidas por el usuario que devuelven valores escalares se pueden invocar mediante instrucciones de control de flujo en sus expresiones booleanas.

Expresiones CASE

Las funciones definidas por el usuario que devuelven un valor escalar se pueden invocar en cualquiera de las expresiones CASE.

Instrucciones PRINT

Las funciones definidas por el usuario que devuelven una cadena de caracteres se pueden invocar como expresión string_expr de instrucciones PRINT.

Funciones y procedimientos almacenados

 Los argumentos de funciones también pueden hacer referencia a una función definida por el usuario que devuelve un valor escalar.

 Las instrucciones RETURN integer_expression de procedimientos almacenados pueden llamar a funciones definidas por el usuario que devuelven un entero comointeger_expression.

 Las instrucciones RETURN return_type_spec de funciones definidas por el usuario pueden invocar a funciones definidas por el usuario que devuelven un tipo de datos escalar como return_type_spec, con tal de
que el valor devuelto por la función definida por el usuario que se invoca pueda convertirse implícitamente en el tipo de datos de vuelta de la función que realiza la invocación.

Ejecutar funciones definidas por el usuario que devuelven un valor escalar

Puede ejecutar funciones definidas por el usuario que devuelven valores escalares de la misma forma que si se tratara de procedimientos almacenados. Cuando ejecute una función definida por el usuario que devuelve un
valor escalar, los parámetros se especifican del mismo modo que para los procedimientos almacenados:

 Los valores de argumento no se incluyen entre paréntesis.

 Se pueden especificar nombres de parámetros.

 Si se especifican nombres de parámetros, los valores de argumento no tienen que estar en la misma secuencia que los parámetros.

En el siguiente ejemplo se crea una función definida por el usuario que devuelve un valor escalar decimal.

SQL
IF OBJECT_ID(N'dbo.ufn_CubicVolume', N'FN') IS NOT NULL
DROP FUNCTION dbo.ufn_CubicVolume;
GO
CREATE FUNCTION dbo.ufn_CubicVolume

7
-- Input dimensions in centimeters.
(@CubeLength decimal(4,1), @CubeWidth decimal(4,1),
@CubeHeight decimal(4,1) )
RETURNS decimal(12,3) -- Cubic Centimeters.
WITH SCHEMABINDING
AS
BEGIN
RETURN ( @CubeLength * @CubeWidth * @CubeHeight )
END;
GO

El siguiente ejemplo ejecuta la función dbo.ufn_CubicVolume. Mediante la instrucción EXECUTE de Transact-SQL, los argumentos se identifican en un orden distinto al de los parámetros en la definición de la función:

SQL
DECLARE @MyDecimalVar decimal(12,3);
EXEC @MyDecimalVar = dbo.ufn_CubicVolume @CubeLength = 12.3,
@CubeHeight = 4.5, @CubeWidth = 4.5;
SELECT @MyDecimalVar;
GO

El siguiente ejemplo ejecuta la función dbo.ufn_CubicVolume sin especificar los nombres de parámetros:

SQL
DECLARE @MyDecimalVar decimal(12,3);
EXEC @MyDecimalVar = dbo.ufn_CubicVolume 12.3, 4.5, 4.5;
SELECT @MyDecimalVar;
GO

También puede utilizar la sintaxis CALL de ODBC para ejecutar la función dbo.ufn_CubicVolume desde aplicaciones OLE DB u ODBC:

-- First use SQLBindParam to bind the return value parameter marker


-- to a program variable of the appropriate type
SQLExecDirect(hstmt,
"{ CALL ? = dbo.ufn_CubicVolume(12.3, 4.5, 4.5) }",
SQL_NTS);
Invocar funciones definidas por el usuario que devuelven un tipo de datos table

Puede invocar una función definida por el usuario que devuelve una table, donde se permiten expresiones de tabla en la cláusula FROM de instrucciones SELECT, INSERT, UPDATE o DELETE. Una invocación de una función
definida por el usuario que devuelve una tabla puede estar seguida de un alias de tabla opcional. En el ejemplo siguiente se ilustra la llamada a la función con valores de tabla dbo.ufnGetContactInformation en la cláusula
FROM de una instrucción SELECT.

SQL
USE AdventureWorks2008R2;
GO
SELECT ContactID, FirstName, LastName, JobTitle, ContactType
FROM dbo.ufnGetContactInformation(1209);
GO
SELECT ContactID, FirstName, LastName, JobTitle, ContactType
FROM dbo.ufnGetContactInformation(5);
GO

Cuando una función definida por el usuario que devuelve una tabla (table) se invoca en la cláusula FROM de una subconsulta, los argumentos de la función no pueden hacer referencia a columnas de la consulta externa.

Los cursores estáticos de sólo lectura son el único tipo de cursor que se puede abrir en una instrucción SELECT cuya cláusula FROM hace referencia a una función definida por el usuario que devuelve una tabla.

8
Una instrucción SELECT que hace referencia a una función definida por el usuario que devuelve una table invoca la función una sola vez.

Invocar funciones integradas con valores de tabla

Existen varias funciones integradas con valores de tabla que devuelven un valor de tabla. La invocación de estas funciones integradas definidas por el usuario pueden estar no calificadas o utilizar el calificador de
esquema sys. Debe utilizar el calificador de esquema sys para funciones integradas con valores de tabla, porque evita conflictos con funciones definidas por el usuario con el mismo nombre. En el siguiente ejemplo se
muestra cómo invocar la función integrada del sistema fn_helpcollations.

SQL
SELECT *
FROM sys.fn_helpcollations();
GO

Usar sugerencias en funciones con valores de tabla

Al crear una función definida por el usuario, puede aplicar una sugerencia de tabla en las consultas que conforman la definición de la función. Las sugerencias que se aplican a vistas que hacen referencia a funciones con
valores de tabla de Transact-SQL también se aplican a las funciones. Estas funciones pueden entrar en conflicto con las sugerencias de la definición de la función. Para obtener más información, vea Resolución de vistas.

No puede aplicar sugerencias en vistas que hacen referencia a funciones con valores de tabla de CLR.

Nota
La posibilidad de que el Motor de base de datos aplique sugerencias de vistas a funciones con valores de tabla
de múltiples instrucciones que forman parte de la definición de vista se quitará en una versión futura de SQL
Server.

No se puede aplicar una sugerencia de tabla al resultado de ninguna función con valores de tabla de la cláusula FROM de una consulta.

Ver funciones definidas por el usuario


http://msdn.microsoft.com/es-es/library/ms189890.aspx

Hay varios procedimientos almacenados del sistema y vistas de catálogo que brindan información acerca de los
procedimientos almacenados. Con ellos, puede:

 Ver la definición de la función. Es decir, las instrucciones de Transact-SQL que se utilizan para crear una función
definida por el usuario. Esto puede resultarle útil si no tiene los archivos de script de Transact-SQL que se utilizan
para crear la función.
 Obtener información acerca de una función como, por ejemplo, el esquema, la fecha de creación y sus
parámetros.

 Enumerar los objetos utilizados por la función especificada, así como los objetos que utilizan la función
especificada. Esta información puede utilizarse para identificar las funciones que se ven afectadas cuando se cambia
o se quita un objeto de la base de datos.

Para ver la definición de una función definida por el usuario

 sys.sql_modules (Transact-SQL)
 OBJECT_DEFINITION (Transact-SQL)

 sp_helptext (Transact-SQL)

Para ver información acerca de una función definida por el usuario

9
 sys.objects (Transact-SQL)
 sys.parameters (Transact-SQL)

 sp_help (Transact-SQL)

Para ver las dependencias de una función definida por el usuario

 sys.sql_expression_dependencies (Transact-SQL)
 sys.dm_sql_referenced_entities (Transact-SQL)

 sys.dm_sql_referencing_entities (Transact-SQL)

Ejemplos

A. Usar vistas de catálogo del sistema para devolver información acerca de una función definida por el
usuario

En los siguientes ejemplos se utilizan las vistas de catálogo sys.objects y sys.parameters para devolver información sobre
las funciones definidas por el usuario y sus parámetros.

SQL
-- Display metadata about the user-defined functions in AdventureWorks2008R2.
USE AdventureWorks2008R2;
GO
SELECT *
FROM sys.objects
WHERE type IN ('IF','TF','FN','FS','FT');
GO
-- Return parameters associated with the functions
SELECT o.name AS FunctionName, p.*
FROM sys.objects AS o
JOIN sys.parameters AS p ON o.object_id = p.object_ID
WHERE type IN ('IF','TF','FN','FS','FT');
GO

B. Usar OBJECT_DEFINITION

En el siguiente ejemplo se utiliza la función del sistema OBJECT_DEFINITION para devolver la definición de la función
definida por el usuario dbo.ufnGetContactInformation.

SQL
USE AdventureWorks2008R2;
GO
SELECT OBJECT_DEFINITION(OBJECT_ID('dbo.ufnGetContactInformation'));
GO

C. Usar sys.sql_expression_dependencies

En el siguiente ejemplo se utilizan las vistas de catálogo sys.sql_expression_dependencies y sys.columns para devolver los
nombres de tabla y columna de los que depende la función dbo.ufnGetContactInformation definida por el usuario.

10
SQL
USE AdventureWorks2008R2;
GO
SELECT OBJECT_NAME(d.referencing_id) AS referencing_entity,
OBJECT_NAME(referenced_id) AS referenced_entity,
referenced_minor_id AS referenced_column_id,
c.name AS referenced_column
FROM sys.sql_expression_dependencies AS d
JOIN sys.columns AS c ON c.object_id = d.referenced_id
AND c.column_id = d.referenced_minor_id
WHERE d.referencing_id = OBJECT_ID(N'AdventureWorks2008R2.dbo.ufnGetContactInformation');

11

También podría gustarte