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

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 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

@@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.