Funciones deterministas y no deterministas

Actualizado: 17 de julio de 2006

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 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 cómo afectan las funciones definidas por el usuario a 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 Microsoft SQL Server 2005 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

PARSENAME

ACOS

DAY

POWER

ASIN

DEGREES

RADIANS

ATAN

EXP

ROUND

ATN2

FLOOR

SIGN

CEILING

ISNULL

SIN

COALESCE

ISNUMERIC

SQUARE

COS

LOG

SQRT

COT

LOG10

TAN

DATALENGTH

MONTH

YEAR

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

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 con un valor menor o igual a 100 no son deterministas, excepto los estilos 20 y 21. Los estilos con un valor superior a 100 son deterministas, excepto los estilos 106, 107, 109 y 113.

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

@@CONNECTIONS

@@TOTAL_READ

@@CPU_BUSY

@@TOTAL_WRITE

@@DBTS

CURRENT_TIMESTAMP

@@IDLE

GETDATE

@@IO_BUSY

GETUTCDATE

@@MAX_CONNECTIONS

GET_TRANSMISSION_STATUS

@@PACK_RECEIVED

MIN_ACTIVE_ROWVERSION

@@PACK_SENT

NEWID

@@PACKET_ERRORS

NEWSEQUENTIALID

@@TIMETICKS

RAND

@@TOTAL_ERRORS

TEXTPTR

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

Conceptos

Directrices para el diseño de funciones definidas por el usuario
Funciones definidas por el usuario con valores de tabla
Funciones en línea definidas por el usuario
Volver a escribir procedimientos almacenados como funciones

Otros recursos

Diseñar funciones definidas por el usuario

Ayuda e información

Obtener ayuda sobre SQL Server 2005

Historial de cambios

Versión Historial
Contenido modificado:
  • Se ha agregado información a la descripción de la función CONVERT para aclarar que su uso produce resultados deterministas, a menos que el tipo de origen o destino sea datetime o smalldatetime, el otro tipo de origen o destino sea una cadena de caracteres y se especifique un tipo de estilo no determinista.
  • También aclara qué estilos son deterministas y no deterministas.