Está en la página 1de 3

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.

Fuentes

http://technet.microsoft.com/es-es/library/ms178091.aspx
 

También podría gustarte