Funções definidas pelo usuário

Assim como as funções em linguagens de programação, as funções do SQL Server definidas pelo usuário são rotinas que aceitam parâmetros, executam uma ação, como um cálculo complexo, e retornam o resultado dessa ação como um valor. O valor de retorno pode ser um único valor escalar ou um conjunto de resultados.

Neste tópico

Benefícios da função definida pelo usuário

Tipos de funções

Diretrizes

Instruções válidas em uma função

Funções associadas a esquema

Especificando parâmetros

Tarefas relacionadas

Benefícios da função definida pelo usuário

Os benefícios de usar funções definidas pelo usuário em SQL Server são:

  • Eles permitem programação modular.

    Você pode criar a função uma vez, armazená-la no banco de dados e chamá-la quantas vezes quiser em seu programa. Funções definidas pelo usuário podem ser modificadas independentemente do código-fonte do programa.

  • Elas permitem execução mais rápida.

    Semelhantemente aos procedimentos armazenados, Transact-SQL as funções definidas pelo usuário reduzem o custo de compilação do código Transact-SQL colocando os planos em cache e reusando-os para execuções repetidas. Isso significa que a função definida pelo usuário não precisa ser reanalisada e reotimizada em cada utilização resultando em tempos de execução mais rápidos.

    As funções CLR oferecem uma vantagem de desempenho significativa sobre funções Transact-SQL para tarefas de computação, manipulação de cadeias de caracteres e lógica de negócios. As funções Transact-SQL são mais adequadas à lógica intensiva de acesso a dados.

  • Eles podem reduzir o tráfego de rede.

    Uma operação que filtra dados com base em alguma restrição complexa que não pode ser expressa em uma única expressão escalar pode ser expressa como uma função. Em seguida, a função pode ser invocada na cláusula WHERE para reduzir o número ou linhas enviadas ao cliente.

ObservaçãoObservação

As funções definidas pelo usuário Transact-SQL em consultas só podem ser executadas em um único thread (plano de execução serial).

Ícone de seta usado com o link Voltar ao Início[Top]

Tipos de funções

  • Função escalar
    As funções escalares definidas pelo usuário retornam um valor único de dados do tipo definido na cláusula RETURNS. Para uma função escalar embutida, não há um corpo de função; o valor escalar é o resultado de uma única instrução. Para uma função escalar de várias instruções, o corpo da função, definido em um bloco BEGIN...END, contém uma série de instruções Transact-SQL, que retornam o valor único. O tipo de retorno pode ser qualquer tipo de dados, exceto text, ntext, image, cursore timestamp.

  • Funções com valor de tabela
    As funções com valor de tabela definidas pelo usuário retornam um tipo de dados table. Para uma função com valor de tabela embutida, não há um corpo de função; a tabela é o conjunto de resultados de uma única instrução SELECT.

  • Funções de sistema
    SQL Server fornece muitas funções de sistema que você pode usar para executar uma variedade de operações. Elas não podem ser modificadas. Para obter mais informações, consulte Funções internas (Transact-SQL), Funções armazenadas do sistema (Transact-SQL) e Exibições e funções de gerenciamento dinâmico (Transact-SQL).

Ícone de seta usado com o link Voltar ao Início[Top]

Diretrizes

Transact-SQL erros que fazem com que uma instrução seja cancelada e que continue com a instrução seguinte no módulo (como os gatilhos ou os procedimentos armazenados) são tratados de modo diferente na função. Nas funções, esses erros fazem com que a execução da função seja interrompida. Em troca, isso faz com que a instrução que chamou a função seja cancelada.

As instruções em um bloco BEGIN... END não podem ter nenhum efeito colateral. Os efeitos colaterais da função são as alterações permanentes realizada no estado de um recurso que tem um escopo fora da função como uma modificação em uma tabela do banco de dados. As únicas alterações que podem ser feitas pelas instruções na função são alterações em objetos locais à função, como cursores ou variáveis locais. As modificações em tabelas de banco de dados, operações em cursores que não são locais à função, envio de e-mail, tentativa de modificação em catálogo e geração de um conjunto de resultados retornados ao usuário são exemplos de ações que não devem ser realizadas em uma função.

ObservaçãoObservação

Se a instrução CREATE FUNCTION produzir efeitos colaterais contra os recursos que não existem quanto a instrução CREATE FUNCTION é emitida, o SQL Server executa a instrução. Porém, o SQL Server não executa a função quando é chamada.

O número de vezes em que uma função especificada em uma consulta é realmente executada pode variar entre os planos de execução desenvolvidos pelo otimizador. Um exemplo é a função chamada por uma subconsulta em uma cláusula WHERE. O número de vezes em que a subconsulta e sua função são executadas pode variar com os caminhos de acesso diferentes escolhidos pelo otimizador.

Ícone de seta usado com o link Voltar ao Início[Top]

Instruções válidas em uma função

Os tipos de instruções que são válidos em uma função incluem:

  • As instruções DECLARE podem ser usadas para definir variáveis de dados e cursores que são locais à função.

  • A atribuição de valores a objetos locais à função, como o uso de SET para atribuir valores para escalar e para as variáveis locais à tabela.

  • As operações de cursor que referenciam cursores locais são declaradas, abertas, fechadas e desalocadas na função. As instruções FETCH que retornam os dados aos clientes não são permitidas. Somente instruções FETCH que atribuem valores a variáveis locais usando a cláusula INTO são permitidas.

  • Instruções de controle-de-fluxo exceto as instruções TRY ... CATCH.

  • Instruções SELECT com listas de seleção com expressões que atribuem valores às variáveis que são locais à função.

  • As instruções UPDATE, INSERT e DELETE que modificam variáveis de tabela que são locais à função.

  • Instruções EXECUTE que chamam um procedimento armazenado estendido.

Funções do sistema internas

As funções não determinísticas internas a seguir podem ser usadas nas funções definidas por usuário Transact-SQL.

CURRENT_TIMESTAMP

@@MAX_CONNECTIONS

GET_TRANSMISSION_STATUS

@@PACK_RECEIVED

GETDATE

@@PACK_SENT

GETUTCDATE

@@PACKET_ERRORS

@@CONNECTIONS

@@TIMETICKS

@@CPU_BUSY

@@TOTAL_ERRORS

@@DBTS

@@TOTAL_READ

@@IDLE

@@TOTAL_WRITE

@@IO_BUSY

 

As funções não determinísticas internas a seguir não podem ser usadas nas funções definidas pelo usuário Transact-SQL.

NEWID

RAND

NEWSEQUENTIALID

TEXTPTR

Para obter uma lista das funções internas do sistema determinísticas e não determinísticas, consulte Funções determinísticas e não determinísticas.

Ícone de seta usado com o link Voltar ao Início[Top]

Funções associadas a esquema

CREATE FUNCTION dá suporte à cláusula SCHEMABINDING que associa a função ao esquema de qualquer objeto que ela referencia, como tabelas, exibições e demais funções definidas pelo usuário. Uma tentativa para alterar ou descartar qualquer objeto referenciado por uma função associada a esquema falhará.

Essas condições devem ser cumpridas antes de especificar SCHEMABINDING em CREATE FUNCTION:

  • Todas as exibições e as funções definidas pelo usuário referenciadas pela função devem ser associadas a esquema.

  • Todos os objetos referenciados pela função devem estar no mesmo banco de dados da função. Os objetos devem ser referenciados usando nomes de uma única parte ou nomes de duas partes.

  • Você deve ter permissão REFERENCES em todos os objetos (tabelas, exibições e funções definidas pelo usuário) referenciados na função.

Você pode usar ALTER FUNCTION para remover a associação a esquema. A instrução ALTER FUNCTION deve redefinir a função sem especificar WITH SCHEMABINDING.

Ícone de seta usado com o link Voltar ao Início[Top]

Especificando parâmetros

Uma função definida pelo usuário usa parâmetros de entrada zero ou mais e retorna um valor escalar ou uma tabela. A função pode ter um máximo de 1024 parâmetros de entrada. Quando um parâmetro da função tiver um valor padrão, a palavra-chave DEFAULT deve ser especificada quando a função for chamada para obter o valor padrão. Esse comportamento é diferente dos parâmetros com valores padrão nos procedimentos armazenados definidos pelo usuário nos quais a omissão de parâmetro também implica o valor padrão. Funções definidas pelo usuário não dão suporte aos parâmetros de saída.

Ícone de seta usado com o link Voltar ao Início[Top]

Tarefas relacionadas

Descrição da Tarefa

Tópico

Descreve como criar uma função definida pelo usuário do Transact-SQL

Criar funções definidas pelo usuário (Mecanismo de Banco de Dados)

Descreve como criar uma função CLR.

Criar funções CLR

Descreve como criar uma função de agregação definida pelo usuário

Criar agregações definidas pelo usuário

Descreve como modificar uma função definida pelo usuário do Transact-SQL

Modificar funções definidas pelo usuário

Descreve como excluir uma função definida pelo usuário.

Excluir funções definidas pelo usuário

Descreve como executar uma função definida pelo usuário.

Executar funções definidas pelo usuário

Descreve como renomear uma função definida pelo usuário

Renomear funções definidas pelo usuário

Descreve como exibir a definição de uma função definida pelo usuário.

Exibir funções definidas pelo usuário

Ícone de seta usado com o link Voltar ao Início[Top]