Partilhar via


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

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceEndpoint de análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de dados SQL no Microsoft Fabric

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 dado o mesmo estado do banco de dados. 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. Por exemplo, a função AVG sempre retorna o mesmo resultado dadas as qualificações declaradas anteriormente, mas a GETDATE função, que retorna o valor 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 clusterizado não pode ser criado em um modo de exibição se o modo de exibição fizer referência a quaisquer funções não determinísticas. Para obter mais informações sobre as propriedades das funções, incluindo determinismo, consulte Funções definidas pelo usuário.

As funções determinísticas devem estar ligadas ao esquema. Use a SCHEMABINDING cláusula ao criar uma função determinística.

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

Determinar se uma função é determinística

Você pode verificar se uma função é determinística consultando a is_deterministic propriedade object para a função. O exemplo a seguir determina se a função Sales.CalculateSalesTax é determinística.

SELECT OBJECTPROPERTY(OBJECT_ID('Sales.CalculateSalesTax'), 'IsDeterministic');

Determinismo de função incorporado

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 ORDER BY cláusula 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, exceto FORMAT. Para obter uma lista dessas funções, consulte Funções de cadeia de caracteres.

As seguintes funções internas de categorias de funções internas diferentes das funções de cadeia de caracteres são sempre determinísticas.

  • ABS
  • ACOS
  • ASIN
  • ATAN
  • ATN2
  • CEILING
  • COALESCE
  • COS
  • COT
  • DATALENGTH
  • DATEADD
  • DATEDIFF
  • DAY
  • DEGREES
  • EXP
  • FLOOR
  • ISNULL
  • ISNUMERIC
  • LOG
  • LOG10
  • MONTH
  • NULLIF
  • POWER
  • RADIANS
  • ROUND
  • SIGN
  • SIN
  • SQRT
  • SQUARE
  • TAN
  • YEAR

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 Comments
Todas as funções agregadas Todas as funções agregadas são determinísticas, a menos que sejam especificadas com as OVER cláusulas e ORDER BY . Para obter uma lista dessas funções, consulte Agregar funções.
CAST Determinístico, a menos que usado com datetime, smalldatetime ou sql_variant.
CONVERT Determinística, 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 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 determinista, o parâmetro style 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ística, exceto para CHECKSUM(*).
ISDATE Determinístico somente se usado com a CONVERT função, o CONVERT parâmetro style é especificado e style não é igual a 0, 100, 9 ou 109.
RAND RAND é determinística apenas quando um parâmetro seed é especificado.

Todas as funções de configuração, cursor, metadados, segurança e estatísticas do sistema são não determinísticas. Você pode ver uma lista dessas funções.

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

  • @@CONNECTIONS
  • @@CPU_BUSY
  • @@DBTS
  • @@IDLE
  • @@IO_BUSY
  • @@MAX_CONNECTIONS
  • @@PACKET_ERRORS
  • @@PACK_RECEIVED
  • @@PACK_SENT
  • @@TIMETICKS
  • @@TOTAL_ERRORS
  • @@TOTAL_READ
  • @@TOTAL_WRITE
  • AT TIME ZONE
  • CUME_DIST
  • CURRENT_TIMESTAMP
  • DENSE_RANK
  • FIRST_VALUE
  • FORMAT
  • GETDATE
  • GETUTCDATE
  • GET_TRANSMISSION_STATUS
  • LAG
  • LAST_VALUE
  • LEAD
  • MIN_ACTIVE_ROWVERSION
  • NEWID
  • NEWSEQUENTIALID
  • NEXT VALUE FOR
  • NTILE
  • PARSENAME
  • PERCENTILE_CONT
  • PERCENTILE_DISC
  • PERCENT_RANK
  • RAND
  • RANK
  • ROW_NUMBER
  • TEXTPTR

Chamar procedimentos armazenados estendidos a partir de funções

As funções que chamam procedimentos armazenados estendidos não são determinísticas, porque os procedimentos armazenados estendidos podem causar efeitos colaterais no banco de dados. Os efeitos colaterais são alterações em um estado global do banco de dados, como uma atualização de uma tabela, ou em um recurso externo, como um arquivo ou a rede. Os exemplos incluem modificar um ficheiro ou enviar uma mensagem de correio eletrónico. Não confie no retorno de um conjunto de resultados consistente ao executar um procedimento armazenado estendido a partir 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 retorne conjuntos de resultados para o cliente tem 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 ingressar na 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 Windows sob a qual o SQL Server está sendo executado. O proprietário do procedimento armazenado estendido deve considerar as permissões desse contexto de segurança ao conceder permissões a outros usuários para executar o procedimento.