Compartilhar via


Funções determinísticas e não determinísticas

As funções determinísticas sempre retornam o mesmo resultado sempre que são chamadas com um conjunto específico de valores de entrada e recebem o mesmo estado do banco de dados. As funções não determinísticas podem retornar resultados diferentes sempre que forem chamadas com um conjunto específico de valores de entrada, mesmo que o estado de banco de dados que eles acessam permaneça o mesmo. Por exemplo, a função AVG sempre retorna o mesmo resultado, considerando as qualificações declaradas acima, mas a função GETDATE, que retorna o valor de datetime atual, sempre retorna um resultado diferente.

Há várias propriedades de funções definidas pelo usuário que determinam a capacidade do Mecanismo de Banco de Dados do SQL Server de indexar os resultados da função, seja por meio de índices em colunas computadas que chamam a função ou por meio de exibições indexadas que fazem referência à função. O determinismo de uma função é uma dessas propriedades. Por exemplo, um índice agrupado não poderá ser criado em uma visão se a visão fizer referência a funções não determinísticas. Para obter mais informações sobre as propriedades das funções, incluindo o determinismo, consulte User-Defined Functions.

Este tópico identifica o determinismo das funções internas do sistema e o efeito na propriedade determinística das funções definidas pelo usuário quando ela contém uma chamada para procedimentos armazenados estendidos.

Determinismo de função incorporada

Você não pode influenciar o determinismo de qualquer função interna. Cada função interna é determinística ou não determinística com base em como a função é implementada pelo SQL Server. Por exemplo, especificar uma cláusula ORDER BY em uma consulta não altera o determinismo de uma função usada nessa consulta.

Todas as funções internas de cadeia de caracteres são determinísticas. Para obter uma lista dessas funções, consulte Funções de Cadeia de Caracteres (Transact-SQL).

As seguintes funções internas de categorias de funções internas que não sejam funções de cadeia de caracteres são sempre determinísticas.

ABS DATEDIFF PODER
ACOS DIA RADIANOS
ASIN (número de identificação padrão da Amazon) GRAUS RODADA
ATAN EXP SINAL
ATN2 PISO Pecado
TETO ISNULL (verifica se um valor é nulo) QUADRADO
COALESCER ISNUMERIC SQRT
PORQUE REGISTRO BRONZEADO
cama dobrável LOG10 ANO
DATALENGTH MÊS
DATEADD NULLIF

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 maneira determinística.

Função Comentários
todas as funções de agregação Todas as funções de agregação são determinísticas, a menos que sejam especificadas com as cláusulas OVER e ORDER BY. Para obter uma lista dessas funções, consulte Funções de Agregação (Transact-SQL).
ELENCO Determinístico, a menos que usado com datetime, smalldatetimeou sql_variant.
CONVERTER Determinístico, a menos que exista uma destas condições:

O tipo de origem é sql_variant.

O tipo de destino é sql_variant e seu tipo de origem não é determinístico.

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. Para ser determinístico, o parâmetro de estilo deve ser uma constante. Além disso, estilos menores ou iguais a 100 são não determinísticos, exceto para os estilos 20 e 21. Estilos maiores que 100 são determinísticos, exceto para os estilos 106, 107, 109 e 113.
CHECKSUM Determinístico, com exceção de CHECKSUM(*).
ISDATE 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.
RAND O RAND é determinístico somente quando um parâmetro de semente é especificado.

Todas as funções estatísticas de configuração, cursor, metadados, segurança e sistema não são determinísticas. 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 do Sistema (Transact-SQL).

As seguintes funções internas de outras categorias são sempre não determinísticas.

@@CONEXÕES GETDATE
@@CPU_BUSY GETUTCDATE
@@DBTS OBTER_ESTADO_DA_TRANSMISSÃO
@@IDLE ATRASO
@@IO_BUSY ÚLTIMO_VALOR
@@MAX_CONNECTIONS LIDERANÇA
@@PACK_RECEIVED MIN_ACTIVE_ROWVERSION
@@PACK_SENT NEWID
@@PACKET_ERRORS NEWSEQUENTIALID
@@TIMETICKS PRÓXIMO VALOR PARA
@@TOTAL_ERRORS NTILE
@@TOTAL_LIDO PARSENAME
@@TOTAL_WRITE PERCENTIL_CONT
CUME_DIST PERCENTILE_DISC
CURRENT_TIMESTAMP PERCENT_RANK
DENSE_RANK RAND
PRIMEIRO_VALOR CLASSIFICAÇÃO
ROW_NUMBER
TEXTPTR

Chamando procedimentos armazenados estendidos a partir de funções

As funções que chamam procedimentos armazenados estendidos não são determinísticas, pois os procedimentos armazenados estendidos podem causar efeitos colaterais no banco de dados. Efeitos colaterais são alterações em um estado global do banco de dados, como uma atualização para uma tabela ou para um recurso externo, como um arquivo ou a rede; por exemplo, modificar um arquivo ou enviar uma mensagem de email. Você não deve contar com o retorno de um conjunto de resultados consistente ao executar um procedimento armazenado estendido de uma função definida pelo usuário. Funções definidas pelo usuário que criam efeitos colaterais no banco de dados não são recomendadas.

Quando chamado de dentro de uma função, o procedimento armazenado estendido não pode retornar conjuntos de resultados para o cliente. Qualquer API do Open Data Services que retorna conjuntos de resultados para o cliente terá um código de retorno de FAIL.

O procedimento armazenado estendido pode se conectar novamente ao SQL Server. No entanto, o procedimento não pode participar da mesma transação que a função original que invocou o procedimento armazenado estendido.

Semelhante às invocações de um lote ou procedimento armazenado, o procedimento armazenado estendido é executado no contexto da conta de segurança do Microsoft Windows na qual o SQL Server está em execução. O proprietário do procedimento armazenado estendido deve considerar isso ao conceder permissões a outros usuários para executar o procedimento.