Share via


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 indexados que referenciam a função. Essas propriedades também se aplicam a métodos de Tipos de dados 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.