Compartir a través de


Funciones deterministas y no deterministas

Las funciones deterministas siempre devuelven el mismo resultado cada vez que se llaman con un conjunto específico de valores de entrada y se proporcionan el mismo estado de la base de datos. Las funciones no deterministas pueden devolver resultados diferentes cada vez que se les llama con un conjunto específico de valores de entrada incluso si el estado de la base de datos al que acceden sigue siendo el mismo. Por ejemplo, la función AVG siempre devuelve el mismo resultado dados los requisitos indicados anteriormente, pero la función GETDATE, que devuelve el valor datetime actual, siempre devuelve un resultado diferente.

Hay varias propiedades de funciones definidas por el usuario que determinan la capacidad del motor de base de datos de SQL Server para indexar los resultados de la función, ya sea a través de índices en columnas calculadas que llaman a la función o a través de vistas indizadas que hacen referencia a la función. El determinismo de una función es una propiedad de este tipo. Por ejemplo, no se puede crear un índice agrupado en una vista si la vista hace referencia a funciones no deterministas. Para obtener más información sobre las propiedades de las funciones, incluido el determinismo, consulte User-Defined Functions.

En este tema se identifica el determinismo de las funciones del sistema integradas y el efecto en la propiedad determinista de las funciones definidas por el usuario cuando contiene una llamada a procedimientos almacenados extendidos.

Determinismo de función integrado

No puede influir en el determinismo de ninguna función integrada. Cada función integrada es determinista o no determinista en función de cómo sql Server implementa la función. Por ejemplo, especificar una cláusula ORDER BY en una consulta no cambia el determinismo de una función que se usa en esa consulta.

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

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

sistema antibloqueo de frenos (ABS) DATEDIFF PODER
ACOS DÍA RADIANES
ASIN Grados REDONDO
ATAN EXP SEÑAL
ATN2 PISO PECADO
TECHO ISNULL (función para verificar si un valor es nulo) CUADRADO
COALESCE ISNUMERIC SQRT
COS REGISTRO BRONCEADO
CUNA LOG10 AÑO
DATALENGTH MES
DATEADD NULLIF

Las funciones siguientes no siempre son deterministas, pero se pueden usar en vistas indizadas o índices en columnas calculadas cuando se especifican de forma determinista.

Función Comentarios
todas las funciones de agregado Todas 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).
REPARTO Determinista a menos que se use con datetime, smalldatetimeo sql_variant.
CONVERTIR Determinista a menos que exista 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 de destino es datetime o smalldatetime, el otro tipo de origen o de destino es una cadena de caracteres y se especifica un estilo no determinista. Para ser determinista, el parámetro style debe ser una constante. Además, los estilos menores o iguales a 100 no son deterministas, excepto los estilos 20 y 21. Los estilos mayores que 100 son deterministas, excepto los estilos 106, 107, 109 y 113.
CHECKSUM Determinista, a excepción de CHECKSUM(*).
ISDATE Determinista solo si se usa con la función CONVERT, se especifica el parámetro convert style y style no es igual a 0, 100, 9 o 109.
RAND RAND es determinista solo cuando se especifica un parámetro de semilla.

Toda la configuración, el cursor, los metadatos, la seguridad y las funciones 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 de otras categorías siempre no son deterministas.

@@CONEXIONES GETDATE
@@CPU_OCUPADO GETUTCDATE
@@DBTS OBTENER_ESTADO_DE_TRANSMISIÓN
@@IDLE RETRASO
@@IO_BUSY ÚLTIMO_VALOR
@@MAX_CONNECTIONS LIDERAR
@@PAQUETE_RECIBIDO MIN_ACTIVE_ROWVERSION (Versión de fila activa mínima)
@@PACK_SENT NEWID
@@ERRORES_DE_PAQUETE NEWSEQUENTIALID
@@TIMETICKS SIGUIENTE VALOR PARA
@@TOTAL_ERRORS NTILE
@@TOTAL_READ PARSENAME
@@TOTAL_ESCRITURA PERCENTILE_CONT
CUME_DIST PERCENTILE_DISC
CURRENT_TIMESTAMP RANGO_PORCENTAJE
DENSE_RANK RAND
FIRST_VALUE RANGO
ROW_NUMBER
TEXTPTR

Llamar a procedimientos extendidos almacenados desde las funciones

Las funciones que llaman a procedimientos almacenados extendidos no son deterministas, ya que los procedimientos almacenados extendidos pueden causar efectos secundarios en la base de datos. Los efectos secundarios son cambios en un estado global de la base de datos, como una actualización a una tabla o a un recurso externo, como un archivo o la red; por ejemplo, modificar un archivo o enviar un mensaje de correo electrónico. No debe confiar en devolver un conjunto de resultados coherente al ejecutar un procedimiento almacenado extendido desde una función definida por el usuario. No se recomiendan las funciones definidas por el usuario que crean efectos secundarios en la base de datos.

Cuando se llama desde dentro de una función, el procedimiento almacenado extendido no puede devolver conjuntos de resultados al cliente. Cualquier API de Open Data Services que devuelva conjuntos de resultados al cliente tendrá un código de retorno de FAIL.

El procedimiento almacenado extendido puede establecer una conexión de nuevo con SQL Server. Sin embargo, el procedimiento no puede combinar la misma transacción que la función original que invocó el procedimiento almacenado extendido.

De forma similar a las invocaciones de un procedimiento almacenado o por lotes, el procedimiento almacenado extendido se ejecuta en el contexto de la cuenta de seguridad de Microsoft Windows en la que se ejecuta SQL Server. El propietario del procedimiento almacenado extendido debe tener en cuenta esto al conceder permisos a otros usuarios para ejecutar el procedimiento.