Funções determinísticas e não determinísticas
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. 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 se o estado do banco de dados que elas acessam permaneça o mesmo.
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 referenciar qualquer função não determinística. Para obter mais informações sobre as propriedades de funções, inclusive determinismo, consulte Funções definidas pelo usuário.
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.
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 no modo como a função é implementada pelo SQL Server.
Todas as funções internas de agregação e cadeia de caracteres são determinísticas. Para obter uma lista dessas funções, consulte Funções de agregação (Transact-SQL) e Funções de cadeia de caracteres (Transact-SQL).
As funções internas a seguir de categorias de funções internas diferentes de agregação e cadeia de caracteres sempre são determinísticas.
ABS |
DATEDIFF |
POWER |
ACOS |
DAY |
RADIANS |
ASIN |
DEGREES |
ROUND |
ATAN |
EXP |
SIGN |
ATN2 |
FLOOR |
SIN |
CEILING |
ISNULL |
SQUARE |
COALESCE |
ISNUMERIC |
SQRT |
COS |
LOG |
TAN |
COT |
LOG10 |
YEAR |
DATALENGTH |
MONTH |
|
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 uma maneira determinística.
Função |
Comentários |
---|---|
CAST |
Determinística, a menos que usada com datetime, smalldatetime ou sql_variant. |
CONVERT |
Determinística, a menos que um destas condições exista:
|
CHECKSUM |
Determinístico, com a 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 |
RAND só é determinística quando um parâmetro seed é especificado. |
Todas as funções estatísticas de configuração, cursor, metadados, segurança e sistema são nã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 de sistema (Transact-SQL).
As funções internas a seguir de outras categorias nunca são determinísticas.
@@CONNECTIONS |
@@TOTAL_WRITE |
@@CPU_BUSY |
CURRENT_TIMESTAMP |
@@DBTS |
GETDATE |
@@IDLE |
GETUTCDATE |
@@IO_BUSY |
GET_TRANSMISSION_STATUS |
@@MAX_CONNECTIONS |
MIN_ACTIVE_ROWVERSION |
@@PACK_RECEIVED |
NEWID |
@@PACK_SENT |
NEWSEQUENTIALID |
@@PACKET_ERRORS |
NEXT VALUE FOR |
@@TIMETICKS |
PARSENAME |
@@TOTAL_ERRORS |
RAND |
@@TOTAL_READ |
TEXTPTR |
Chamando procedimentos armazenados estendidos de funções
Funções que chamam procedimentos armazenados estendidos são não determinísticas, porque esses procedimentos podem causar efeitos colaterais no banco de dados. Efeitos colaterais são alterações a 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. Você não deve confiar no 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 Open Data Services que retorna conjuntos de resultados para o cliente terá um código de retorno FAIL.
O procedimento armazenado estendido pode se conectar novamente a SQL Server. No entanto, o procedimento não pode unir a mesma transação como a função original que invocou o procedimento armazenado estendido.
Semelhante a invocações de um procedimento armazenado ou em lotes, o procedimento armazenado estendido é executado no contexto da conta de segurança do Microsoft Windows sob a qual o SQL Server está sendo executado. O proprietário do procedimento armazenado estendido deve considerar isso ao conceder permissões para outros usuários executarem o procedimento.