Funções definidas pelo utilizador

Aplica-se a:SQL ServerBase de Dados SQL do AzureAzure SQL Managed InstanceEndpoint de análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de dados SQL no Microsoft Fabric

Como as funções em linguagens de programação, as funções definidas pelo usuário do SQL Server 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.

Benefícios das funções definidas pelo usuário

Por que usar funções definidas pelo usuário (UDFs)?

  • Programação modular. Você pode criar a função uma vez, armazená-la no banco de dados e chamá-la qualquer número de vezes em seu programa. As funções definidas pelo usuário podem ser modificadas independentemente do código-fonte do programa.

  • Execução mais rápida. Semelhante aos procedimentos armazenados, Transact-SQL funções definidas pelo usuário reduzem o custo de compilação do código Transact-SQL armazenando em cache os planos e reutilizando-os para execuções repetidas. Isso significa que a função definida pelo usuário não precisa ser reparada e reotimizada a cada uso, resultando em tempos de execução mais rápidos.

    As funções CLR (Common Language Runtime) oferecem uma vantagem de desempenho significativa em relação às funções Transact-SQL para tarefas computacionais, manipulação de cadeias de caracteres e lógica de negócios. As funções Transact-SQL são mais adequadas para lógica intensiva de acesso a dados.

  • Reduza 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. A função pode então ser invocada na cláusula WHERE para reduzir o número de linhas enviadas ao cliente.

Importante

Transact-SQL UDFs em consultas só podem ser executadas em um único thread (plano de execução serial). Portanto, o uso de UDFs inibe o processamento de consultas paralelas. Para obter mais informações sobre o processamento paralelo de consultas, consulte o Guia de arquitetura de processamento de consultas.

Tipos de funções

Esta seção descreve as diferenças entre funções escalares, funções com valor de tabela e funções do sistema.

Funções escalares

As funções escalares definidas pelo usuário retornam um único valor de dados do tipo definido na cláusula RETURNS. Para uma função escalar embutida, o valor escalar retornado é o resultado de uma única instrução. Para uma função escalar de várias instruções, o corpo da função pode conter uma série de instruções Transact-SQL que retornam o valor único. O tipo de retorno pode ser qualquer tipo de dados, exceto texto, ntext, imagem, cursor e carimbo de data/hora. Para obter exemplos, consulte Criar funções definidas pelo usuário (mecanismo de banco de dados).

Funções com valor de tabela

As funções com valor de tabela (TVFs) definidas pelo usuário retornam um tipo de dados de tabela . Para uma função com valor de tabela embutido, não há corpo de função; a tabela é o conjunto de resultados de uma única instrução SELECT. Para obter exemplos, consulte Criar funções definidas pelo usuário (mecanismo de banco de dados).

Funções do sistema

O SQL Server fornece muitas funções do sistema que você pode usar para executar várias operações. Eles não podem ser modificados. Para obter mais informações, consulte Quais são as funções do banco de dados SQL?, Funções do sistema por categoria para Transact-SQL e Exibições de gerenciamento dinâmico do sistema.

Orientações

Transact-SQL erros que fazem com que uma instrução seja cancelada e continuem com a próxima instrução no módulo (como gatilhos ou procedimentos armazenados) são tratados de forma diferente dentro de uma função. Em funções, tais erros fazem com que a execução da função pare. Isso, por sua vez, faz com que a instrução que invocou a função seja cancelada.

As declarações em um bloco BEGIN...END não podem ter efeitos colaterais. Os efeitos colaterais da função são quaisquer alterações permanentes no estado de um recurso que tem um escopo fora da função, como uma modificação em uma tabela de banco de dados. As únicas alterações que as instruções na função podem fazer são alterações em objetos locais para a função, como cursores ou variáveis locais. Modificações em tabelas de banco de dados, operações em cursores que não são locais para a função, como enviar email, tentar uma modificação de catálogo e gerar um conjunto de resultados que é retornado ao usuário, são exemplos de ações que não podem ser executadas em uma função.

Se uma instrução CREATE FUNCTION produzir efeitos colaterais em relação a recursos que não existam no momento em que a instrução CREATE FUNCTION é emitida, o SQL Server executa a instrução. No entanto, o SQL Server não executa a função quando ela é invocada.

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

As funções determinísticas devem estar ligadas ao esquema. Use a SCHEMABINDING cláusula ao criar uma função determinística.

Para obter mais informações e considerações de desempenho sobre funções definidas pelo usuário, consulte Criar funções definidas pelo usuário (Mecanismo de Banco de Dados).

Instruções válidas numa função

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

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

  • Atribuições de valores a objetos locais para a função, como usar SET para atribuir valores a variáveis escalares e locais de tabela.

  • Operações de cursor que fazem referência a cursores locais que são declarados, abertos, fechados e desalocados na função. FETCH instruções que retornam dados para o cliente não são permitidas. Somente FETCH instruções que atribuem valores a variáveis locais usando a INTO cláusula são permitidas.

  • Instruções de controlo de fluxo, exceto TRY...CATCH declarações.

  • SELECT instruções contendo listas de seleção com expressões que atribuem valores a variáveis que são locais para a função.

  • UPDATE, INSERTe DELETE instruções modificando variáveis de tabela que são locais para a função.

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

Funções integradas do sistema

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

  • CURRENT_TIMESTAMP
  • GET_TRANSMISSION_STATUS
  • GETDATE
  • GETUTCDATE
  • @@CONNECTIONS
  • @@CPU_BUSY
  • @@DBTS
  • @@IDLE
  • @@IO_BUSY
  • @@MAX_CONNECTIONS
  • @@PACK_RECEIVED
  • @@PACK_SENT
  • @@PACKET_ERRORS
  • @@TIMETICKS
  • @@TOTAL_ERRORS
  • @@TOTAL_READ
  • @@TOTAL_WRITE

As seguintes funções internas não determinísticas não podem ser usadas em um Transact-SQL função definida pelo usuário (UDF).

  • NEWID
  • NEWSEQUENTIALID
  • RAND
  • TEXTPTR

Se você fizer referência a uma dessas funções dentro de um UDF, obterá o seguinte erro:

Msg 443, Level 16, State 1
Invalid use of a side-effecting operator <operator> within a function.

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

Funções ligadas ao esquema

CREATE FUNCTION Suporta uma SCHEMABINDING cláusula que vincula a função ao esquema de quaisquer objetos aos quais ela faz referência, como tabelas, exibições e outras funções definidas pelo usuário. Uma tentativa de alterar ou descartar qualquer objeto referenciado por uma função vinculada ao esquema falha.

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

  • Todas as visualizações e funções definidas pelo usuário referenciadas pela função devem estar ligadas ao esquema.

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

  • Você deve ter REFERENCES permissão 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 de esquema. A ALTER FUNCTION instrução deve redefinir a função sem especificar WITH SCHEMABINDING.

Especificar parâmetros

Uma função definida pelo usuário usa zero ou mais parâmetros de entrada e retorna um valor escalar ou uma tabela. Uma função pode ter um máximo de 1.024 parâmetros de entrada. Quando um parâmetro da função tem um valor padrão, a palavra-chave DEFAULT deve ser especificada ao chamar a função para obter o valor padrão. Esse comportamento é diferente de parâmetros com valores padrão em procedimentos armazenados definidos pelo usuário, nos quais omitir o parâmetro também implica o valor padrão. As funções definidas pelo usuário não suportam parâmetros de saída.