Diretrizes para design de função definida pelo usuário
Uma função definida pelo usuário é armazenada como um objeto de banco de dados que fornece código reutilizável a ser utilizado das seguintes maneiras:
Em instruções Transact-SQL, como SELECT
Em aplicativos que chamam a função
Na definição de outra função definida pelo usuário
Para parametrizar uma exibição ou aprimorar a funcionalidade de uma exibição indexada
Para definir uma coluna em uma tabela
Para definir uma restrição CHECK em uma coluna
Para substituir um procedimento armazenado
Escolhendo o tipo de função
Ao projetar uma função definida pelo usuário, determine primeiramente o tipo de função mais adequado às necessidades. Legue as funções:
Retornar um escalar (valor simples)
Retornar uma tabela (várias linhas)
Executar um cálculo complexo
Acessar primariamente dados do SQL Server
Funções definidas pelo usuário escritas em Transact-SQL ou .NET Framework podem retornar valores escalar e de tabela.
Propriedades de funções
Há várias propriedades de funções definidas pelo usuário que determinam a habilidade 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 através de exibições de índices que referenciam a função. Essas propriedades também se aplicam a métodos de Tipos CLR definidos pelo usuário.
Determinismo
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 lhes é 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 se o estado do banco de dados que elas acessam permaneça o mesmo.
O Mecanismo de Banco de Dados analisa automaticamente o corpo de funções do Transact-SQL e avalia se a função é determinística. Por exemplo, se a função chamar outras funções que não são determinísticas ou se a função chamar procedimentos armazenados estendidos, o Mecanismo de Banco de Dados marcará a função como não-determinística. Com relação às funções CLR (Common Language Runtime), o Mecanismo de Banco de Dados espera que o autor da função marque-a como determinística ou que não utilize o atributo personalizado SqlFunction.
Precisão
Uma função definida pelo usuário é tida como precisa quando não envolve nenhuma operação de ponto flutuante.
O Mecanismo de Banco de Dados analisa automaticamente o corpo de funções Transact-SQL e avalia se a função é precisa. Para funções CLR, o Mecanismo de Banco de Dados espera que o autor da função marque-a como precisa ou que não utilize o atributo personalizado SqlFunction.
Acesso a dados
Essa propriedade indica se a função acessa o servidor de banco de dados local usando o provedor gerenciado em processo do SQL Server. Para obter mais informações, consulte Acesso aos dados dos objetos de banco de dados CLR.
O Mecanismo de Banco de Dados analisa o corpo de funções Transact-SQL automaticamente e avalia se a função executa acesso a dados. Para funções CLR, o Mecanismo de Banco de Dados espera que o autor da função indique as características de acesso a dados usando o atributo personalizado SqlFunction. Essa propriedade é imposta em tempo de execução pelo Mecanismo de Banco de Dados. Se a função indicar que DataAccess = Nenhum, mas executar o acesso a dados, a função falhará em tempo de execução.
Acesso a dados do sistema
Essa propriedade indica se a função acessa os metadados do sistema no servidor de banco de dados local usando o provedor gerenciado em processo do SQL Server.
O Mecanismo de Banco de Dados analisa automaticamente o corpo de funções Transact-SQL e avalia se a função executa acesso a dados de sistema. Com relação às funções CLR, o Mecanismo de Banco de Dados espera que o autor da função indique as características de acesso a dados de sistema usando o atributo personalizado SqlFunction. Essa propriedade é imposta em tempo de execução pelo Mecanismo de Banco de Dados. Se a função indicar que SystemDataAccess = Nenhum, mas executar o acesso a dados de sistema, a função falhará em tempo de execução.
IsSystemVerified
Essa propriedade indica se as propriedades de determinismo e precisão da função são verificáveis pelo Mecanismo de Banco de Dados. Essa propriedade é verdadeira para as funções Transact-SQL, desde que não chamem nenhuma função marcada como IsSystemVerified = falso. A propriedade é falsa para funções CLR.
O Mecanismo de Banco de Dados deriva automaticamente as propriedades de funções IsSystemVerified. Com relação às funções Transact-SQL, se elas acessarem qualquer função marcada como IsSystemVerified = falso, a própria função ficará marcada como IsSystemVerified = falso.
Para obter mais informações sobre funções em colunas computadas indexadas e exibições indexadas, consulte Criando índices em colunas computadase Criando exibições indexadas.