Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Banco de Dados SQL do
AzureInstância
Gerenciada de SQL do AzurePonto de extremidade de análise de SQL no Microsoft Fabric
Warehouse no Microsoft Fabric
Banco 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 com o mesmo estado do banco de dados. Funções não determinísticas podem retornar resultados diferentes cada vez 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 anteriormente, mas a GETDATE função, 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, 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. O determinismo de uma função é uma dessas propriedades. Por exemplo, um índice clusterizado não poderá ser criado em uma exibição se ela fizer referência a 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 associadas ao esquema. Use a cláusula SCHEMABINDING ao criar uma função determinística.
Este artigo identifica o determinismo das funções internas do sistema e o efeito sobre a propriedade determinística das funções definidas pelo usuário quando elas 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 propriedade do objeto is_deterministic para essa 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 interna
Você não pode influenciar o determinismo de nenhuma 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 pertencentes a categorias de funções internas que não sejam de cadeia de caracteres sempre são determinísticas.
ABSACOSASINATANATN2CEILINGCOALESCECOSCOTDATALENGTHDATEADDDATEDIFFDAYDEGREESEXPFLOORISNULLISNUMERICLOGLOG10MONTHNULLIFPOWERRADIANSROUNDSIGNSINSQRTSQUARETANYEAR
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 forma 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 OVER cláusulas e ORDER BY . Para obter uma lista dessas funções, consulte Funções de Agregação. |
CAST |
Determinística a menos que usado com datetime, smalldatetimeou sql_variant. |
CONVERT |
Determinística, a menos que um destas condições exista: O tipo é 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, com exceção dos estilos 20 e 21. Estilos maiores que 100 são determinísticos, com exceção dos estilos 106, 107, 109 e 113. |
CHECKSUM |
Determinístico, exceto por CHECKSUM(*). |
ISDATE |
Determinístico somente se usado com a CONVERT função, o CONVERT parâmetro de estilo é especificado e o estilo não é igual a 0, 100, 9 ou 109. |
RAND |
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 são não determinísticas. Você pode ver uma lista dessas funções.
As funções internas a seguir de outras categorias nunca são determinísticas.
@@CONNECTIONS@@CPU_BUSY@@DBTS@@IDLE@@IO_BUSY@@MAX_CONNECTIONS@@PACKET_ERRORS@@PACK_RECEIVED@@PACK_SENT@@TIMETICKS@@TOTAL_ERRORS@@TOTAL_READ@@TOTAL_WRITEAT TIME ZONECUME_DISTCURRENT_TIMESTAMPDENSE_RANKFIRST_VALUEFORMATGETDATEGETUTCDATEGET_TRANSMISSION_STATUSLAGLAST_VALUELEADMIN_ACTIVE_ROWVERSIONNEWIDNEWSEQUENTIALIDNEXT VALUE FORNTILEPARSENAMEPERCENTILE_CONTPERCENTILE_DISCPERCENT_RANKRANDRANKROW_NUMBERTEXTPTR
Chamar procedimentos armazenados estendidos a partir de funções
Funções que chamam procedimentos armazenados estendidos são não determinísticas, pois esses procedimentos 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. Exemplos incluem modificar um arquivo ou enviar uma mensagem de email. 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 retorna 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 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 Windows na qual o SQL Server está em execução. 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.