Directrices para el diseño de funciones definidas por el usuario

Una función definida por el usuario se almacena como un objeto de base de datos que proporciona código reutilizable y se puede utilizar de las siguientes maneras:

  • En instrucciones Transact-SQL como SELECT

  • En las aplicaciones que llaman a la función

  • En la definición de otra función definida por el usuario

  • Para parametrizar una vista o mejorar la funcionalidad de una vista indizada

  • Para definir una columna en una tabla

  • Para definir una restricción CHECK en una columna

  • Para reemplazar un procedimiento almacenado

Elegir un tipo de función

Al diseñar una función definida por el usuario, primero es preciso determinar el tipo de función que mejor se ajuste a sus necesidades. Así pues, es necesario determinar si la función:

  • Devolverá un valor escalar (un solo valor)

  • Devolverá una tabla (varias filas)

  • Realizará un cálculo complejo

  • Si tendrá acceso principalmente a los datos de SQL Server

Las funciones definidas por el usuario escritas en Transact-SQL o .NET Framework pueden devolver valores escalares y de tabla.

Propiedades de las funciones

Son varias las propiedades de las funciones definidas por el usuario que determinan la capacidad de SQL Server Database Engine (Motor de base de datos de SQL Server) para indizar los resultados de la función, ya sea mediante índices en columnas calculadas que llaman a la función o mediante vistas indizadas que hacen referencia a la función. Estas propiedades también se aplican a los métodos de tipos definidos por el usuario para CLR.

Determinismo

Las funciones deterministas devuelven el mismo resultado cada vez que se llaman con un conjunto específico de valores de entrada y cuando el estado de la base de datos es el mismo. Las funciones no deterministas pueden devolver resultados diferentes cada vez que se llaman con un conjunto específico de valores de entrada aunque el estado de la base de datos a la que tienen acceso permanezca sin cambios.

Motor de base de datos analiza automáticamente el cuerpo de las funciones Transact-SQL y evalúa si la función es determinista. Por ejemplo, si la función llama a otras funciones que no son deterministas o si la función llama a procedimientos almacenados extendidos, entonces, Motor de base de datos marca la función como no determinista. Para las funciones CLR (Common Language Runtime), Motor de base de datos confía en el autor de la función para marcar o no la función como determinista mediante el atributo personalizado SqlFunction.

Precisión

Una función definida por el usuario se considera precisa si en ella no interviene ninguna operación de coma flotante.

Motor de base de datos analiza automáticamente el cuerpo de las funciones Transact-SQL y evalúa si la función es precisa. Para las funciones CLR, Motor de base de datos confía en el autor de la función para marcar o no la función como precisa mediante el atributo personalizado SqlFunction.

Acceso a datos

Esta propiedad indica si la función tiene acceso al servidor de la base de datos local mediante un proveedor administrado en curso de SQL Server. Para obtener más información, vea Acceso a datos de objetos de base de datos de CLR.

Motor de base de datos analiza automáticamente el cuerpo de las funciones Transact-SQL y evalúa si la función realiza el acceso a datos. Para las funciones CLR, Motor de base de datos confía en el autor de la función para indicar las características del acceso a los datos mediante el atributo personalizado SqlFunction. Motor de base de datos fuerza el uso de esta propiedad en tiempo de ejecución. Si la función indica que DataAccess = None, pero se realiza el acceso a los datos, la función no será correcta en tiempo de ejecución.

Acceso a datos del sistema

Esta propiedad indica si la función tiene acceso a los metadatos del sistema en el servidor de la base de datos local mediante un proveedor administrado en curso de SQL Server.

Motor de base de datos analiza automáticamente el cuerpo de las funciones Transact-SQL y evalúa si la función realiza el acceso a datos del sistema. Para las funciones CLR, Motor de base de datos confía en el autor de la función para indicar las características del acceso a los datos del sistema mediante el atributo personalizado SqlFunction. Motor de base de datos fuerza el uso de esta propiedad en tiempo de ejecución. Si la función indica que SystemDataAccess = None, pero se realiza el acceso a los datos del sistema, la función no será correcta en tiempo de ejecución.

IsSystemVerified

Esta propiedad indica si Motor de base de datos puede comprobar las propiedades de determinismo y precisión de la función. Esta propiedad es verdadera para las funciones Transact-SQL siempre que no llamen a ninguna función marcada como IsSystemVerified = false. La propiedad es falsa para las funciones CLR.

Motor de base de datos deriva automáticamente la propiedad IsSystemVerified para las funciones. Para las funciones Transact-SQL, si tienen acceso a cualquier función marcada como IsSystemVerified = false, la propia función se marca como IsSystemVerified = false.

Para obtener más información acerca de las columnas calculadas indizadas y las vistas indizadas, vea Crear índices en columnas calculadas y Crear vistas indizadas.