Funciones deterministas y no deterministas

Funciones deterministas y no deterministas

 

Se aplica a: SQL Server 2016

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. Por ejemplo, la función AVG siempre devuelve el mismo resultado dadas las condiciones indicadas anteriormente pero la función GETDATE, que devuelve el valor datetime actual, siempre devuelve un resultado diferente.

Son varias las propiedades de las funciones definidas por el usuario que determinan la capacidad de 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 sobre las propiedades de las funciones, incluido el determinismo, vea 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.

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. Por ejemplo, al especificar una cláusula ORDER BY en una consulta, no se cambia el determinismo de una función que se usa en la consulta.

Todas las funciones integradas de cadena son deterministas. Para obtener una lista de estas funciones, vea Funciones de cadena (Transact-SQL).

Las siguientes funciones integradas procedentes de categorías de funciones integradas que no son de cadena siempre son deterministas.

ABSDATEDIFFPOWER
ACOSDAYRADIANS
ASINDEGREESROUND
ATANEXPSIGN
ATN2FLOORSIN
CEILINGISNULLSQUARE
COALESCEISNUMERICSQRT
COSLOGTAN
COTLOG10YEAR
DATALENGTHMONTH
DATEADDNULLIF

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ónComentarios
todas las funciones de agregadoTodas las funciones de agregado son deterministas a menos que se especifiquen con las cláusulas OVER y ORDER BY. Para obtener una lista de estas funciones, vea Funciones de agregado (Transact-SQL).
CASTDeterministas, a menos que se usen con datetime, smalldatetime o sql_variant.
CONVERTDeterminista, a menos que se cumpla una de estas condiciones:

 

El tipo de origen es sql_variant.

El tipo de destino es sql_variant y su 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.
CHECKSUMDeterminista, excepto CHECKSUM(*).
ISDATEDeterminista 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.
RANDRAND 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 de 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.

@@CONNECTIONSGETDATE
@@CPU_BUSYGETUTCDATE
@@DBTSGET_TRANSMISSION_STATUS
@@IDLELAG
@@IO_BUSYLAST_VALUE
@@MAX_CONNECTIONSLEAD
@@PACK_RECEIVEDMIN_ACTIVE_ROWVERSION
@@PACK_SENTNEWID
@@PACKET_ERRORSNEWSEQUENTIALID
@@TIMETICKSNEXT VALUE FOR
@@TOTAL_ERRORSNTILE
@@TOTAL_READPARSENAME
@@TOTAL_WRITEPERCENTILE_CONT
CUME_DISTPERCENTILE_DISC
CURRENT_TIMESTAMPPERCENT_RANK
DENSE_RANKRAND
FIRST_VALUERANK
ROW_NUMBER
TEXTPTR

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.

Adiciones de comunidad

AGREGAR
Mostrar:
© 2016 Microsoft