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
Las funciones definidas por el usuario se han ampliado en Microsoft SQL Server 2005 para incluir las funciones escritas en cualquier lenguaje de programación que se admita en Microsoft .NET Framework. Además, se han quitado algunas restricciones sobre el uso de funciones no deterministas. Estos cambios influyen en la decisión acerca del tipo de función definida por el usuario que se va a diseñar e implementar.
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.
Database Engine (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, Database Engine (Motor de base de datos) marca la función como no determinista. Para las funciones CLR (Common Language Runtime), Database Engine (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.
Database Engine (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, Database Engine (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 Data Access from CLR Database Objects.
Database Engine (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, Database Engine (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. Database Engine (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.
Database Engine (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, Database Engine (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. Database Engine (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 Database Engine (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.
Database Engine (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.
Vea también
Conceptos
Funciones definidas por el usuario con valores de tabla
Funciones en línea definidas por el usuario
Funciones deterministas y no deterministas
Volver a escribir procedimientos almacenados como funciones