Funções determinísticas e não determinísticasDeterministic and Nondeterministic Functions

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure nãoSQL Data Warehouse do Azure nãoParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

As funções determinísticas sempre retornam o mesmo resultado quando são chamadas com o uso de um conjunto específico de valores de entrada e quando recebem o mesmo estado do banco de dados.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. As funções não determinísticas podem retornar resultados diferentes cada vez que são chamadas com um conjunto específico de valores de entrada, mesmo que o estado do banco de dados que elas acessam permaneça o mesmo.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 exemplo, a função AVG sempre retorna o mesmo resultado, dadas as qualificações declaradas acima, mas a função GETDATE, que retorna o valor datetime atual, sempre retorna um 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.

Há várias propriedades de funções definidas pelo usuário que determinam a capacidade do Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine de indexar os resultados da função, tanto por meio de índices em colunas computadas que chamam a função como por meio de exibições indexadas que referenciam a função.There are several properties of user-defined functions that determine the ability of the Mecanismo de Banco de Dados do 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. O determinismo de uma função é uma dessas propriedades.The determinism of a function is one such property. Por exemplo, um índice clusterizado não poderá ser criado em uma exibição se ela referenciar qualquer função não determinística.For example, a clustered index cannot be created on a view if the view references any nondeterministic functions. Para obter mais informações sobre propriedades de funções, inclusive determinismo, consulte Funções definidas pelo usuário.For more information about the properties of functions, including determinism, see User-Defined Functions.

Este tópico identifica o determinismo de funções de sistema internas e o efeito da propriedade determinística de funções definidas pelo usuário quando ela contém uma chamada para procedimentos armazenados estendidos.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 função internaBuilt-in Function Determinism

Você não pode influenciar o determinismo de nenhuma função interna.You cannot influence the determinism of any built-in function. Cada função interna é determinística ou não determinística com base no modo como a função é implementada pelo SQL ServerSQL Server.Each built-in function is deterministic or nondeterministic based on how the function is implemented by SQL ServerSQL Server. Por exemplo, a especificação de uma cláusula ORDER BY em uma consulta não altera o determinismo de uma função usada nessa 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 as funções internas de cadeia de caracteres são determinísticas.All of the string built-in functions are deterministic. Para obter uma lista dessas funções, consulte Funções de sequência de caracteres (Transact-SQL).For a list of these functions, see String Functions (Transact-SQL).

As seguintes funções internas pertencentes a categorias de funções internas que não sejam de cadeia de caracteres sempre são determinísticas.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

As funções a seguir nem sempre são determinísticas, mas podem ser usadas em exibições indexadas ou índices em colunas computadas quando são especificadas de uma maneira determinística.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.

FunçãoFunction ComentáriosComments
todas as funções de agregaçãoall aggregate functions Todas as funções de agregação são determinísticas, a menos que sejam especificadas com as cláusulas OVER e ORDER BY.All aggregate functions are deterministic unless they are specified with the OVER and ORDER BY clauses. Para obter uma lista dessas funções, consulte Funções de agregação (Transact-SQL).For a list of these functions, see Aggregate Functions (Transact-SQL).
CASTCAST Determinística a menos que usado com datetime, smalldatetimeou sql_variant.Deterministic unless used with datetime, smalldatetime, or sql_variant.
CONVERTCONVERT Determinística, a menos que um destas condições exista:Deterministic unless one of these conditions exists:



O tipo é sql_variant.Source type is sql_variant.

O tipo de destino é sql_variant e seu tipo de origem é não determinístico.Target type is sql_variant and its source type is nondeterministic.

O tipo de origem ou de destino é datetime ou smalldatetime, o outro tipo de origem ou destino é uma cadeia de caracteres, e um estilo não determinístico é especificado.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 ser determinístico, o parâmetro de estilo deve ser uma constante.To be deterministic, the style parameter must be a constant. Além disso, estilos menores ou iguais a 100 são não determinísticos, com exceção dos estilos 20 e 21.Additionally, styles less than or equal to 100 are nondeterministic, except for styles 20 and 21. Estilos maiores que 100 são determinísticos, com exceção dos estilos 106, 107, 109 e 113.Styles greater than 100 are deterministic, except for styles 106, 107, 109 and 113.
CHECKSUMCHECKSUM Determinístico, com a exceção de CHECKSUM(*).Deterministic, with the exception of CHECKSUM(*).
ISDATEISDATE Determinístico somente se usado com a função CONVERT, o parâmetro de estilo CONVERT é especificado e o estilo não é igual a 0, 100, 9 ou 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 só é determinística quando um parâmetro seed é especificado.RAND is deterministic only when a seed parameter is specified.

Todas as funções estatísticas de configuração, cursor, metadados, segurança e sistema são não determinísticas.All the configuration, cursor, metadata, security, and system statistical functions are nondeterministic. Para obter uma lista dessas funções, consulte Funções de configuração (Transact-SQL), Funções de cursor (Transact-SQL), Funções de metadados (Transact-SQL), Funções de segurança (Transact-SQL) e Funções estatísticas de 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).

As funções internas a seguir de outras categorias nunca são determinísticas.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

Chamando procedimentos armazenados estendidos de funçõesCalling Extended Stored Procedures from Functions

Funções que chamam procedimentos armazenados estendidos são não determinísticas, pois esses procedimentos podem causar efeitos colaterais no banco de dados.Functions that call extended stored procedures are nondeterministic, because the extended stored procedures can cause side effects on the database. Efeitos colaterais são alterações em um estado global do banco de dados, como a atualização de uma tabela ou de um recurso externo, como um arquivo ou a rede; por exemplo, a modificação de um arquivo ou o envio de uma mensagem de email.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. Não confie no retorno de um conjunto de resultados consistente ao executar um procedimento armazenado estendido de uma função definida pelo usuário.Do not rely on returning a consistent result set when executing an extended stored procedure from a user-defined function. Funções definidas pelo usuário que criam efeitos colaterais no banco de dados não são recomendadas.User-defined functions that create side effects on the database are not recommended.

Quando chamado de dentro de uma função, o procedimento armazenado estendido não pode retornar conjuntos de resultados para o cliente.When called from inside a function, the extended stored procedure cannot return result sets to the client. Todas as APIs Open Data Services que retornam conjuntos de resultados para o cliente têm um código de retorno FAIL.Any Open Data Services API that returns result sets to the client, has a return code of FAIL.

O procedimento armazenado estendido pode voltar a se conectar ao SQL ServerSQL Server.The extended stored procedure can connect back to SQL ServerSQL Server. No entanto, o procedimento não pode unir a mesma transação como a função original que invocou o procedimento armazenado estendido.However, the procedure cannot join the same transaction as the original function that invoked the extended stored procedure.

Semelhante a invocações de um procedimento armazenado ou em lotes, o procedimento armazenado estendido é executado no contexto da conta de segurança do MicrosoftMicrosoft Windows sob a qual o SQL ServerSQL Server está sendo executado.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. O proprietário do procedimento armazenado estendido deve considerar as permissões do contexto de segurança, ao conceder permissões a outros usuários para executar o procedimento.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.