Funciones deterministas y no deterministas
Las funciones deterministas devuelven siempre el mismo resultado cada vez que se invocan 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.
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. El determinismo de una función es una propiedad así. Por ejemplo, no se puede crear un índice agrupado en una vista si ésta hace referencia a funciones no deterministas. Para obtener más información acerca de las propiedades de las funciones, incluido el determinismo, vea Directrices para el diseño de funciones definidas por el usuario.
En este tema se identifica el determinismo de las funciones integradas del sistema y el efecto de las funciones definidas por el usuario en la propiedad determinista cuando ésta contiene una llamada a los procedimientos almacenados extendidos.
Determinismo de las funciones integradas
El determinismo de las funciones integradas no se ve afectado por el usuario. Las funciones integradas son deterministas o no deterministas según el modo en que SQL Server implementa cada función.
Todas las funciones integradas de cadena y de agregados son deterministas. Para obtener una lista de estas funciones, vea Funciones de agregado (Transact-SQL) y Funciones de cadena (Transact-SQL).
Las siguientes funciones integradas procedentes de categorías de funciones integradas que no son funciones de agregado ni de cadena son siempre deterministas.
ABS |
DATEDIFF |
POWER |
ACOS |
DAY |
RADIANS |
ASIN |
DEGREES |
ROUND |
ATAN |
EXP |
SIGN |
ATN2 |
FLOOR |
SIN |
CEILING |
ISNULL |
SQUARE |
COALESCE |
ISNUMERIC |
SQRT |
COS |
LOG |
TAN |
COT |
LOG10 |
YEAR |
DATALENGTH |
MONTH |
|
DATEADD |
NULLIF |
|
Las siguientes funciones no siempre son deterministas, pero pueden utilizarse en vistas indizadas o en índices de columnas calculadas si se especifican de una manera determinista.
Función |
Comentarios (sintaxis de MDX) |
---|---|
CAST |
Determinista, a menos que se utilice con datetime, smalldatetime o sql_variant. |
CONVERT |
Determinista, a menos que se cumpla una de estas condiciones:
|
CHECKSUM |
Determinista, excepto CHECKSUM(*). |
ISDATE |
Determinista sólo si se utiliza con la función CONVERT, se especifica el parámetro de estilo CONVERT y el estilo no es igual a 0, 100, 9 ni 109. |
RAND |
RAND es determinista sólo cuando se especifica un parámetro seed. |
Todas las funciones de configuración, cursores, metadatos, seguridad y estadísticas del sistema no son deterministas. Para obtener una lista de estas funciones, vea Funciones de configuración (Transact-SQL), Funciones del cursor (Transact-SQL), Funciones de metadatos (Transact-SQL), Funciones de seguridad (Transact-SQL) y Funciones estadísticas del sistema (Transact-SQL).
Las siguientes funciones integradas, procedentes de otras categorías, nunca son deterministas.
@@CONNECTIONS |
@@TOTAL_WRITE |
@@CPU_BUSY |
CURRENT_TIMESTAMP |
@@DBTS |
GETDATE |
@@IDLE |
GETUTCDATE |
@@IO_BUSY |
GET_TRANSMISSION_STATUS |
@@MAX_CONNECTIONS |
MIN_ACTIVE_ROWVERSION |
@@PACK_RECEIVED |
NEWID |
@@PACK_SENT |
NEWSEQUENTIALID |
@@PACKET_ERRORS |
PARSENAME |
@@TIMETICKS |
RAND |
@@TOTAL_ERRORS |
TEXTPTR |
@@TOTAL_READ |
Llamar a procedimientos almacenados extendidos desde funciones
Las funciones que llaman a procedimientos almacenados extendidos no son deterministas porque los procedimientos almacenados extendidos pueden producir efectos secundarios en la base de datos. Los efectos secundarios son cambios de un estado global de la base de datos, como una actualización de una tabla, o de un recurso externo, como un archivo o la red (por ejemplo, la modificación de un archivo o el envío de un mensaje de correo electrónico). No debe confiar en la devolución de un conjunto de resultados coherente al ejecutar un procedimiento almacenado extendido desde una función definida por el usuario. No se recomienda el uso de funciones definidas por el usuario que producen efectos secundarios en la base de datos.
Cuando se llama desde una función, el procedimiento almacenado extendido no puede devolver conjuntos de resultados al cliente. Las API de Servicios abiertos de datos que devuelven conjuntos de resultados al cliente tienen un código de retorno FAIL.
El procedimiento almacenado extendido puede volver a conectarse a SQL Server. Sin embargo, no puede combinar la misma transacción como la función original que invocó el procedimiento almacenado extendido.
De forma similar a las invocaciones desde un lote o un procedimiento almacenado, el procedimiento almacenado extendido se ejecuta en el contexto de la cuenta de seguridad de Microsoft Windows con la que se ejecuta SQL Server. El propietario del procedimiento almacenado extendido debe tener esto en cuenta al conceder permisos a otros usuarios para ejecutar el procedimiento.
Vea también