Funciones deterministas y no deterministasDeterministic and Nondeterministic Functions

SE APLICA A: síSQL Server (a partir de 2008) síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

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.Deterministic functions always return the same result any time they are called with a specific set of input values and given the same state of the database. 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.Nondeterministic functions may return different results each time they are called with a specific set of input values even if the database state that they access remains the same. 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.For example, the function AVG always returns the same result given the qualifications stated above, but the GETDATE function, which returns the current datetime value, always returns a different result.

Son varias las propiedades de las funciones definidas por el usuario que determinan la capacidad de Motor de base de datos de SQL ServerSQL Server Database Engine 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.There are several properties of user-defined functions that determine the ability of the Motor de base de datos de SQL ServerSQL Server Database Engine to index the results of the function, either through indexes on computed columns that call the function, or through indexed views that reference the function. El determinismo de una función es una propiedad así.The determinism of a function is one such property. Por ejemplo, no se puede crear un índice clúster en una vista si ésta hace referencia a funciones no deterministas.For example, a clustered index cannot be created on a view if the view references any nondeterministic functions. Para obtener más información sobre las propiedades de las funciones, incluido el determinismo, vea Funciones definidas por el usuario.For more information about the properties of functions, including determinism, see User-Defined Functions.

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.This topic identifies the determinism of built-in system functions and the effect on the deterministic property of user-defined functions when it contains a call to extended stored procedures.

Determinismo de las funciones integradasBuilt-in Function Determinism

El determinismo de las funciones integradas no se ve afectado por el usuario.You cannot influence the determinism of any built-in function. Las funciones integradas son deterministas o no deterministas según el modo en que SQL ServerSQL Serverimplementa cada función.Each built-in function is deterministic or nondeterministic based on how the function is implemented by SQL ServerSQL Server. 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.For example, specifying an ORDER BY clause in a query does not change the determinism of a function that is used in that query.

Todas las funciones integradas de cadena son deterministas.All of the string built-in functions are deterministic. Para obtener una lista de estas funciones, vea Funciones de cadena (Transact-SQL).For a list of these functions, see String Functions (Transact-SQL).

Las siguientes funciones integradas procedentes de categorías de funciones integradas que no son de cadena siempre son deterministas.The following built-in functions from categories of built-in functions other than string functions are always deterministic.

ABSABS DATEDIFFDATEDIFF POWERPOWER
ACOSACOS DAYDAY RADIANSRADIANS
ASINASIN DEGREESDEGREES ROUNDROUND
ATANATAN EXPEXP SIGNSIGN
ATN2ATN2 FLOORFLOOR SINSIN
CEILINGCEILING ISNULLISNULL SQUARESQUARE
COALESCECOALESCE ISNUMERICISNUMERIC SQRTSQRT
COSCOS LOGLOG TANTAN
COTCOT LOG10LOG10 YEARYEAR
DATALENGTHDATALENGTH MONTHMONTH
DATEADDDATEADD NULLIFNULLIF

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.The following functions are not always deterministic, but can be used in indexed views or indexes on computed columns when they are specified in a deterministic manner.

FunciónFunction ComentariosComments
todas las funciones de agregadoall aggregate functions Todas las funciones de agregado son deterministas a menos que se especifiquen con las cláusulas OVER y ORDER BY.All aggregate functions are deterministic unless they are specified with the OVER and ORDER BY clauses. Para obtener una lista de estas funciones, vea Funciones de agregado (Transact-SQL).For a list of these functions, see Aggregate Functions (Transact-SQL).
CASTCAST Deterministas, a menos que se usen con datetime, smalldatetimeo sql_variant.Deterministic unless used with datetime, smalldatetime, or sql_variant.
CONVERTCONVERT Determinista, a menos que se cumpla una de estas condiciones:Deterministic unless one of these conditions exists:



El tipo de origen es sql_variant.Source type is sql_variant.

El tipo de destino es sql_variant y su tipo de origen no es determinista.Target type is sql_variant and its source type is nondeterministic.

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.Source or target type is datetime or smalldatetime, the other source or target type is a character string, and a nondeterministic style is specified. Para que sea determinista, el parámetro de estilo debe ser una constante.To be deterministic, the style parameter must be a constant. Además, los estilos menores o iguales que 100 son no deterministas, salvo los estilos 20 y 21.Additionally, styles less than or equal to 100 are nondeterministic, except for styles 20 and 21. Los estilos mayores que 100 son deterministas, salvo los estilos 106, 107, 109 y 113.Styles greater than 100 are deterministic, except for styles 106, 107, 109 and 113.
CHECKSUMCHECKSUM Determinista, excepto CHECKSUM(*).Deterministic, with the exception of CHECKSUM(*).
ISDATEISDATE 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.Deterministic only if used with the CONVERT function, the CONVERT style parameter is specified and style is not equal to 0, 100, 9, or 109.
RANDRAND RAND es determinista solo cuando se especifica un parámetro seed .RAND is deterministic only when a seed parameter is specified.

Todas las funciones de configuración, cursores, metadatos, seguridad y estadísticas del sistema no son deterministas.All the configuration, cursor, metadata, security, and system statistical functions are nondeterministic. 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).For a list of these functions, see Configuration Functions (Transact-SQL), Cursor Functions (Transact-SQL), Metadata Functions (Transact-SQL), Security Functions (Transact-SQL), and System Statistical Functions (Transact-SQL).

Las siguientes funciones integradas, procedentes de otras categorías, no son deterministas nunca.The following built-in functions from other categories are always nondeterministic.

@@CONNECTIONS@@CONNECTIONS GETDATEGETDATE
@@CPU_BUSY@@CPU_BUSY GETUTCDATEGETUTCDATE
@@DBTS@@DBTS GET_TRANSMISSION_STATUSGET_TRANSMISSION_STATUS
@@IDLE@@IDLE LAGLAG
@@IO_BUSY@@IO_BUSY LAST_VALUELAST_VALUE
@@MAX_CONNECTIONS@@MAX_CONNECTIONS LEADLEAD
@@PACK_RECEIVED@@PACK_RECEIVED MIN_ACTIVE_ROWVERSIONMIN_ACTIVE_ROWVERSION
@@PACK_SENT@@PACK_SENT NEWIDNEWID
@@PACKET_ERRORS@@PACKET_ERRORS NEWSEQUENTIALIDNEWSEQUENTIALID
@@TIMETICKS@@TIMETICKS NEXT VALUE FORNEXT VALUE FOR
@@TOTAL_ERRORS@@TOTAL_ERRORS NTILENTILE
@@TOTAL_READ@@TOTAL_READ PARSENAMEPARSENAME
@@TOTAL_WRITE@@TOTAL_WRITE PERCENTILE_CONTPERCENTILE_CONT
AT TIME ZONEAT TIME ZONE PERCENTILE_DISCPERCENTILE_DISC
CUME_DISTCUME_DIST PERCENT_RANKPERCENT_RANK
CURRENT_TIMESTAMPCURRENT_TIMESTAMP RANDRAND
DENSE_RANKDENSE_RANK RANKRANK
FIRST_VALUEFIRST_VALUE ROW_NUMBERROW_NUMBER
FORMATFORMAT TEXTPTRTEXTPTR

Llamar a procedimientos almacenados extendidos desde funcionesCalling Extended Stored Procedures from Functions

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.Functions that call extended stored procedures are nondeterministic, because the extended stored procedures can cause side effects on the database. 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).Side effects are changes to a global state of the database, such as an update to a table, or to an external resource, such as a file or the network; for example, modifying a file or sending an e-mail message. No confíe en la devolución de un conjunto de resultados coherente al ejecutar un procedimiento almacenado extendido desde una función definida por el usuario.Do not rely on returning a consistent result set when executing an extended stored procedure from a user-defined function. No se recomienda el uso de funciones definidas por el usuario que producen efectos secundarios en la base de datos.User-defined functions that create side effects on the database are not recommended.

Cuando se llama desde una función, el procedimiento almacenado extendido no puede devolver conjuntos de resultados al cliente.When called from inside a function, the extended stored procedure cannot return result sets to the client. Las API de Servicios abiertos de datos que devuelven conjuntos de resultados al cliente tienen un código de retorno FAIL.Any Open Data Services API that returns result sets to the client, has a return code of FAIL.

El procedimiento almacenado extendido puede volver a conectarse a SQL ServerSQL Server.The extended stored procedure can connect back to SQL ServerSQL Server. Sin embargo, no puede combinar la misma transacción como la función original que invocó el procedimiento almacenado extendido.However, the procedure cannot join the same transaction as the original function that invoked the extended stored procedure.

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 MicrosoftMicrosoft Windows con la que se ejecuta SQL ServerSQL Server .Similar to invocations from a batch or stored procedure, the extended stored procedure is executed in the context of the MicrosoftMicrosoft Windows security account under which SQL ServerSQL Server is running. El propietario del procedimiento almacenado extendido debe tener en cuenta los permisos de este contexto de seguridad al conceder permisos a otros usuarios para ejecutar el procedimiento.The owner of the extended stored procedure should consider the permissions of this security context, when granting permissions to other users to execute the procedure.