Funciones deterministas y no deterministas

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.

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 clúster 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 que no son de agregados ni de cadena siempre son 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:

  • El tipo de origen es sql_variant.

  • El tipo de destino es sql_variant y el tipo de origen no es determinista.

  • El tipo de origen o destino es datetime o smalldatetime, el otro tipo de origen o destino es una cadena de caracteres, y se especifica un tipo de estilo no determinista. Para que sea determinista, el parámetro de estilo debe ser una constante. Además, los estilos menores o iguales que 100 son no deterministas, salvo los estilos 20 y 21. Los estilos mayores que 100 son deterministas, salvo los estilos 106, 107, 109 y 113.

CHECKSUM

Determinista, excepto CHECKSUM(*).

ISDATE

Determinista solo 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 solo 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, no son deterministas nunca.

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