Compartilhar via


CRIAR FUNÇÃO

Aplica-se ao ponto de extremidade de análise do SQL e ao Warehouse no Microsoft Fabric

CREATE FUNCTION pode criar funções de valor de tabela embutidas e funções escalares.

Observação

UDFs escalares são um recurso de visualização no Fabric Data Warehouse.

Importante

No Fabric Data Warehouse, UDFs escalares devem ser embutidos para uso com SELECT ... FROM consultas em tabelas de usuário, mas você ainda pode criar funções que não são embutidas. UDFs escalares que não são embutidos funcionam em um número limitado de cenários. Você pode verificar se uma UDF pode ser embutida.

Uma função definida pelo usuário é uma rotina Transact-SQL que aceita parâmetros, executa uma ação, como um cálculo complexo, e retorna o resultado dessa ação como um valor. As funções escalares retornam um valor escalar, como um número ou cadeia de caracteres. AS TVFs (funções com valor de tabela) definidas pelo usuário retornam uma tabela.

Use CREATE FUNCTION para criar uma rotina T-SQL reutilizável que pode ser usada destas maneiras:

  • Em instruções Transact-SQL, como SELECT
  • Em Transact-SQL DML (instruções de manipulação de dados), como UPDATE, INSERTe DELETE
  • Em aplicativos que chamam a função
  • Na definição de outra função definida pelo usuário
  • Para substituir um procedimento armazenado

Dica

Você pode especificar CREATE OR ALTER FUNCTION para criar uma nova função se não existir por esse nome ou alterar uma função existente, em uma única instrução.

Convenções de sintaxe de Transact-SQL

Sintaxe

Sintaxe da função escalar

CREATE FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ] parameter_data_type   
    [ = default ] }   
    [ ,...n ]  
  ]  
)  
RETURNS return_data_type  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    BEGIN   
        function_body   
        RETURN scalar_expression  
    END  
[ ; ]  

<function_option>::=   
{  
    [ SCHEMABINDING ]  
  | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]  
}  

Sintaxe de função com valor de tabela embutida

CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
    [ = default ] }
    [ ,...n ]
  ]
)
RETURNS TABLE
    [ WITH SCHEMABINDING ]
    [ AS ]
    RETURN [ ( ] select_stmt [ ) ]
[ ; ]

Argumentos

schema_name

O nome do esquema ao qual a função definida pelo usuário pertence.

function_name

O nome da função definida pelo usuário. Os nomes de funções devem obedecer às regras de identificadores e devem ser exclusivos dentro do banco de dados e em seu esquema.

Observação

São necessários parênteses depois do nome de função mesmo que um parâmetro não seja especificado.

@ parameter_name

Um parâmetro na função definida pelo usuário. Podem ser declarados um ou mais parâmetros.

Uma função pode ter no máximo 2.100 parâmetros. O valor de cada parâmetro declarado deve ser fornecido pelo usuário quando a função é executada, a menos que seja definido um padrão para o parâmetro.

Especifique um nome de parâmetro usando um sinal de arroba ( @ ) como o primeiro caractere. O nome do parâmetro precisa estar em conformidade com as regras para identificadores. Os parâmetros são locais para a função. Os mesmos nomes de parâmetro podem ser usados em outras funções. Os parâmetros só podem assumir o lugar de constantes. Eles não podem ser usados no lugar de nomes de tabela, nomes de coluna ou nomes de outros objetos de banco de dados.

Observação

ANSI_WARNINGS não é respeitado quando você passa parâmetros em um procedimento armazenado, função definida pelo usuário ou quando declara e define variáveis em uma instrução em lote. Por exemplo, se a variável for definida como char(3) e, em seguida, configurada com um valor maior que três caracteres, os dados serão truncados até o tamanho definido e a instrução INSERT ou UPDATE terá êxito.

parameter_data_type

O tipo de dados de parâmetro. Para funções Transact-SQL, todos os tipos de dados escalares com suporte são permitidos.

[ = padrão ]

Um valor padrão para o parâmetro. Se um valor default for definido, a função poderá ser executada sem a necessidade de especificar um valor para esse parâmetro.

Quando um parâmetro da função tem um valor padrão, a palavra-chave DEFAULT deve ser especificada quando a função é chamada para recuperar o valor padrão. Esse comportamento é diferente do uso de parâmetros com valores padrão em procedimentos armazenados nos quais a omissão do parâmetro também indica o valor padrão.

return_data_type

O valor retornado de uma função escalar definida pelo usuário.

Para funções no Fabric Data Warehouse, todos os tipos de dados são permitidos, exceto o carimbo dedata/hora/. Tipos nãocalares como tabela não são permitidos.

function_body

Uma série de instruções Transact-SQL.

Em funções escalares, function_body é uma série de instruções Transact-SQL que, juntas, são avaliadas como um valor escalar, o que pode incluir:

  • Expressão de instrução única
  • Expressões de várias instruções (IF/THEN/ELSE e BEGIN/END blocos)
  • Variáveis locais
  • Chamadas para funções SQL internas disponíveis
  • Chamadas para outras UDFs
  • SELECT instruções e referências a tabelas, exibições e funções embutidas com valor de tabela

scalar_expression

Especifica o valor escalar que a função escalar retorna.

select_stmt

A única SELECT instrução que define o valor retornado de uma função embutida com valor de tabela. Para uma função embutida com valor de tabela, não há corpo de função; A tabela é o conjunto de resultados de uma única SELECT instrução.

TABELA

Especifica que o valor retornado da TVF (função com valor de tabela) é uma tabela. Somente constantes e @local_variables podem ser passadas para TVFs.

Em TVFs embutidos (versão prévia), o valor retornado TABLE é definido por meio de uma única SELECT instrução. As funções embutidas não têm variáveis de retorno associadas.

<function_option>

No Fabric Data Warehouse, não INLINEENCRYPTIONhá suporte para palavras-chave e EXECUTE AS , no Fabric Data Warehouse.

As opções de função com suporte incluem:

SCHEMABINDING

Especifica que a função está associada aos objetos de banco de dados referenciados por ela. Quando SCHEMABINDING for especificado, os objetos base não poderão ser modificadas de um modo que possa afetar a definição da função. A própria definição da função deve ser primeiro modificada ou descartada para remover as dependências no objeto a ser modificado.

A associação da função aos objetos referenciados por ela será removida somente quando ocorrer uma das ações a seguir:

  • A função for descartada.

  • A função for modificada com o uso da instrução ALTER sem a especificação da opção SCHEMABINDING.

Uma função poderá ser associada a esquemas apenas se as condições a seguir forem verdadeiras:

  • As funções definidas pelo usuário referenciadas pela função também são associadas a esquema.

  • Os objetos referenciados pela função são referenciados usando um nome de duas partes.

  • Somente funções internas e outras UDFs no mesmo banco de dados podem ser referenciadas no corpo de UDFs.

  • O usuário que executou a instrução tem a CREATE FUNCTION permissão REFERENCES nos objetos de banco de dados aos quais a função faz referência.

Para remover SCHEMABINDING, use ALTER.

RETORNA NULO NA ENTRADA NULA | CHAMADO NA ENTRADA NULA

Especifica o OnNULLCall atributo de uma função com valor escalar. Se não for especificado, CALLED ON NULL INPUT está implícito por padrão e o corpo da função é executado mesmo se NULL for passado como um argumento.

Práticas recomendadas

  • Se uma função definida pelo usuário não for criada com esquema de vinculação, as alterações feitas em objetos subjacentes poderão afetar a definição da função e produzir resultados inesperados quando ela for invocada. É recomendável especificar a WITH SCHEMABINDING cláusula ao criar a função. Isso garante que os objetos referenciados na definição da função não possam ser modificados, a menos que a função também seja modificada.

  • Escrever suas funções definidas pelo usuário para serem embutidas. Para saber mais, confira Scalar UDF Inlining (Embutimento de UDF escalar).

Interoperabilidade

Funções definidas pelo usuário com valor de tabela embutida

Em uma função com valor de tabela embutida, somente uma única instrução select é permitida.

Funções escalares definidas pelo usuário

  • As seguintes instruções são válidas em uma função de valor escalar:

    • Declarações de atribuição
    • Instruções control-of-Flow, exceto TRY...CATCH instruções
    • DECLARE instruções que definem variáveis de dados locais
  • As seguintes funções internas não têm suporte em um corpo de função com valor escalar:

  • UDFs escalares não podem ser usados em uma SELECT ... FROM consulta em uma tabela de usuário quando:

  • UDFs escalares não podem ser usados em uma consulta quando:

    • A UDF é chamada diretamente em uma GROUP BY cláusula.
    • A UDF é chamada diretamente em uma ORDER BY cláusula.
    • A consulta de chamada tem uma CTE (expressão de tabela) comum.
  • Não há suporte para UDFs escalares recursivas.

  • Uma consulta de usuário poderá falhar se mais de 10 chamadas UDF forem feitas em uma única consulta.

  • Em alguns casos de borda, a complexidade da consulta de usuário e do corpo da UDF impede o sublinhado, nesse caso, a UDF escalar não está embutida e a consulta do usuário falha.

  • Quando uma UDF escalar é usada em qualquer cenário sem suporte, você vê uma mensagem de erro "Scalar UDF execution is currently unavailable in this context."

Limitações

Observação

Durante a versão prévia atual, as limitações estão sujeitas a alterações.

Funções definidas pelo usuário não podem ser usadas para executar ações que modificam o estado do banco de dados.

Funções definidas pelo usuário podem ser aninhadas, isto é, uma função definida pelo usuário pode chamar outra. O nível de aninhamento é incrementado quando a execução da função é iniciada, e reduzido quando a execução da função chamada é concluída. As funções definidas pelo usuário no Fabric Data Warehouse podem ser aninhadas em até quatro níveis quando um corpo UDF faz referência a uma função com valor de tabela/exibição/em linha ou até 32 níveis de outra forma. Exceder os níveis máximos de aninhamento faz com que a cadeia de funções de chamada falhe.

Metadados

Esta seção lista as exibições do catálogo do sistema que podem ser usadas para retornar metadados sobre funções definidas pelo usuário.

  • sys.sql_modules: exibe a definição de Transact-SQL funções definidas pelo usuário. Por exemplo:

    SELECT definition, type   
    FROM sys.sql_modules AS m  
    JOIN sys.objects AS o   
        ON m.object_id = o.object_id   
        AND type = ('FN');
    
  • sys.parameters: exibe informações sobre os parâmetros definidos em funções definidas pelo usuário.

  • sys.sql_expression_dependencies: exibe os objetos subjacentes referenciados por uma função.

Permissões

Membros das funções Administrador, Membro e Colaborador do workspace do Fabric podem criar funções.

Embutimento de UDF escalar

O Microsoft Fabric Data Warehouse usa a inlining UDF escalar para compilar e executar o código definido pelo usuário de maneira distribuída. O sublinhado escalar UDF é habilitado por padrão.

Embora o sublinhado escalar UDF seja uma técnica de otimização de desempenho introduzida pela primeira vez no Microsoft SQL Server 2019 (15.0), no Fabric Data Warehouse, ele determina o conjunto de cenários com suporte. No Fabric Data Warehouse, UDFs escalares são automaticamente transformados em expressões escalares ou subconsultas escalares que são substituídas na consulta de chamada no lugar do operador UDF.

Alguma sintaxe T-SQL torna um UDF escalar não estálineável. Funções que contêm um WHILE loop, várias RETURN instruções ou uma chamada para uma função interna não determinística do SQL (como GETUTCDATE() ou GETDATE()) não podem ser embutidas. Para obter mais informações, consulte requisitos de inlining da UDF escalar.

Verifique se uma UDF escalar pode ser embutida

A sys.sql_modules exibição do catálogo inclui a coluna is_inlineable, que indica se uma UDF é embutida.

A is_inlineable propriedade é derivada da verificação de sintaxe dentro da definição de UDF. A UDF escalar não está embutida antes do tempo de compilação. Um valor indica 1 que o UDF é embutido, enquanto um valor indica 0 que ele não é embutido. Se uma UDF escalar for embutida, ela não garantirá que sempre será embutida quando a consulta for compilada.

O Fabric Data Warehouse decide (por consulta) se um UDF deve ser embutido, dependendo da complexidade geral da consulta.

Use a seguinte consulta de exemplo para verificar se uma UDF escalar é embutida:

SELECT 
SCHEMA_NAME(b.schema_id) as function_schema_name,
    b.name as function_name,
       b.type_desc as function_type,
       a.is_inlineable
FROM sys.sql_modules AS a
     INNER JOIN sys.objects AS b
         ON a.object_id = b.object_id
WHERE b.type IN ('FN');

Se uma função escalar não estiver embutida sys.sql_modules.is_inlineable, você ainda poderá executar a consulta como uma chamada autônoma, por exemplo, para definir uma variável. Mas a função escalar não pode fazer parte de uma SELECT ... FROM consulta em uma tabela de usuário. Por exemplo:

CREATE FUNCTION [dbo].[custom_SYSUTCDATETIME]()
  RETURNS datetime2(6)
  AS
  BEGIN
   RETURN SYSUTCDATETIME();
  END

A função escalar de exemplo dbo.custom_SYSUTCDATETIME definida pelo usuário não é embutida devido ao uso de uma função de sistema não determinante. SYSUTCDATETIME() Ele falhará quando usado em uma SELECT ... FROM consulta em uma tabela de usuário, mas terá êxito como uma chamada autônoma, por exemplo:

DECLARE @utcdate datetime2(7);
SET @utcdate = dbo.custom_SYSUTCDATETIME();
SELECT @utcdate as 'utc_date';

Exemplos

R. Criar uma função com valor de tabela embutida

O exemplo a seguir cria uma função com valor de tabela embutida para retornar algumas informações importantes sobre módulos, filtrando pelo parâmetro objectType. Ele inclui um valor padrão para retornar todos os módulos quando a função é chamada com o DEFAULT parâmetro. Este exemplo usa algumas das exibições do catálogo do sistema mencionadas em Metadados.

CREATE FUNCTION dbo.ModulesByType (@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN (
        SELECT sm.object_id AS 'Object Id',
            o.create_date AS 'Date Created',
            OBJECT_NAME(sm.object_id) AS 'Name',
            o.type AS 'Type',
            o.type_desc AS 'Type Description',
            sm.DEFINITION AS 'Module Description',
            sm.is_inlineable AS 'Inlineable'
        FROM sys.sql_modules AS sm
        INNER JOIN sys.objects AS o ON sm.object_id = o.object_id
        WHERE o.type LIKE '%' + @objectType + '%'
        );
GO

Em seguida, a função pode ser chamada para retornar todas as funções embutidas com valor de tabela (IF) com:

SELECT * FROM dbo.ModulesByType('IF'); -- SQL_INLINE_TABLE_VALUED_FUNCTION

Ou encontre todas as funções escalares (FN):

SELECT * FROM dbo.ModulesByType('FN'); -- SQL_SCALAR_FUNCTION

B. Combinar resultados de uma função com valor de tabela embutida

Este exemplo simples usa o TVF embutido criado anteriormente para demonstrar como é possível combinar os resultados com outras tabelas usando Cross Apply. Aqui, selecionamos todas as colunas de ambas sys.objects e os resultados de ModulesByType todas as linhas correspondentes na type coluna. Para obter mais informações sobre como usar aplicar, consulte a cláusula FROM mais JOIN, APPLY, PIVOT (Transact-SQL).

SELECT * 
FROM sys.objects AS o
CROSS APPLY dbo.ModulesByType(o.type);
GO

C. Criar uma função UDF escalar

O exemplo a seguir cria uma UDF escalar embutida que mascara um texto de entrada.

CREATE OR ALTER FUNCTION [dbo].[cleanInput] (@InputString VARCHAR(100))
    RETURNS VARCHAR(50)
    AS
    BEGIN
        DECLARE @Result VARCHAR(50)
        DECLARE @CleanedInput VARCHAR(50)

        -- Trim whitespace
        SET @CleanedInput = LTRIM(RTRIM(@InputString))

        -- Handle empty or null input
        IF @CleanedInput = '' OR @CleanedInput IS NULL
        BEGIN
            SET @Result = ''
        END
        ELSE IF LEN(@CleanedInput) <= 2
        BEGIN
            -- If string length is 1 or 2, just return the cleaned string
            SET @Result = @CleanedInput
        END
        ELSE
        BEGIN
            -- Construct the masked string
            SET @Result = 
                LEFT(@CleanedInput, 1) +
                REPLICATE('*', LEN(@CleanedInput) - 2) +
                RIGHT(@CleanedInput, 1)
        END

        RETURN @Result
    END

Você pode chamar a função assim:

DECLARE @input varchar(100) = '123456789'

SELECT dbo.cleanInput (@input) AS function_output;

Mais exemplos de como você pode usar UDFs escalares no Fabric Data Warehouse:

Em uma SELECT instrução:

SELECT TOP 10 
t.id, t.name, 
dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t;

Em uma WHERE cláusula:

 SELECT t.id, t.name, dbo.cleanInput(t.name) AS function_output
FROM dbo.MyTable AS t
WHERE dbo.cleanInput(t.name)='myvalue'

Em uma JOIN cláusula:

SELECT t1.id, t1.name, 
     dbo.cleanInput (t1.name) AS function_output, 
     dbo.cleanInput (t2.name) AS function_output_2
FROM dbo.MyTable1 AS t1
    INNER JOIN dbo.MyTable2 AS t2 
        ON dbo.cleanInput(t1.name)=dbo.cleanInput(t2.name);

Em uma ORDER BY cláusula:

SELECT  t.id, t.name, dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t
ORDER BY function_output;

Em instruções DML (linguagem de manipulação de dados), como INSERT, UPDATEou DELETE:

SELECT t.id, t.name, dbo.cleanInput (t.name) AS function_output 
INTO dbo.MyTable_new
FROM dbo.MyTable AS t;

UPDATE t
SET t.mycolumn_new = dbo.cleanInput (t.name)
FROM dbo.MyTable AS t;

DELETE t
FROM dbo.MyTable AS t
WHERE dbo.cleanInput (t.name) ='myvalue';

Aplica-se a:Azure Synapse AnalyticsAnalytics Platform System (PDW)

Cria uma UDF (função definida pelo usuário) no Azure Synapse Analytics ou PDW (Analytics Platform System). Uma função definida pelo usuário é uma rotina Transact-SQL que aceita parâmetros, executa uma ação, como um cálculo complexo, e retorna o resultado dessa ação como um valor. As TVFs (funções com valor de tabela) definidas pelo usuário retornam um tipo de dados de tabela.

Dica

Para sintaxe no Fabric Data Warehouse, veja a versão do CREATE FUNCTION para o Fabric Data Warehouse.

  • Em PDW (Analytics Platform System), o valor retornado deve ser um valor escalar (único).

  • No Azure Synapse Analytics, CREATE FUNCTION pode retornar uma tabela usando a sintaxe para funções embutidas com valor de tabela (versão prévia) ou pode retornar um único valor usando a sintaxe para funções escalares.

  • Em pools de SQL sem servidor no Azure Synapse Analytics, pode criar funções de valor de tabela embutidas, CREATE FUNCTION mas não funções escalares.

    Use essa instrução para criar uma rotina reutilizável que possa ser usada destas 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 definir uma restrição CHECK em uma coluna

  • Para substituir um procedimento armazenado

  • Usar uma função embutida como um predicado de filtro para uma política de segurança

Convenções de sintaxe de Transact-SQL

Sintaxe

Sintaxe da função escalar

-- Transact-SQL Scalar Function Syntax (in dedicated pools in Azure Synapse Analytics and Parallel Data Warehouse)
-- Not available in the serverless SQL pools in Azure Synapse Analytics

CREATE FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ] parameter_data_type   
    [ = default ] }   
    [ ,...n ]  
  ]  
)  
RETURNS return_data_type  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    BEGIN   
        function_body   
        RETURN scalar_expression  
    END  
[ ; ]  

<function_option>::=   
{  
    [ SCHEMABINDING ]  
  | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]  
}  

Sintaxe de função com valor de tabela embutida

-- Transact-SQL Inline Table-Valued Function Syntax
-- Preview in dedicated SQL pools in Azure Synapse Analytics
-- Available in the serverless SQL pools in Azure Synapse Analytics
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
    [ = default ] }
    [ ,...n ]
  ]
)
RETURNS TABLE
    [ WITH SCHEMABINDING ]
    [ AS ]
    RETURN [ ( ] select_stmt [ ) ]
[ ; ]

Argumentos

schema_name

O nome do esquema ao qual a função definida pelo usuário pertence.

function_name

O nome da função definida pelo usuário. Os nomes de funções devem obedecer às regras de identificadores e devem ser exclusivos dentro do banco de dados e em seu esquema.

Observação

São necessários parênteses depois do nome de função mesmo que um parâmetro não seja especificado.

@ parameter_name

Um parâmetro na função definida pelo usuário. Podem ser declarados um ou mais parâmetros.

Uma função pode ter no máximo 2.100 parâmetros. O valor de cada parâmetro declarado deve ser fornecido pelo usuário quando a função é executada, a menos que seja definido um padrão para o parâmetro.

Especifique um nome de parâmetro usando um sinal de arroba ( @ ) como o primeiro caractere. O nome do parâmetro precisa estar em conformidade com as regras para identificadores. Os parâmetros são locais para a função. Os mesmos nomes de parâmetro podem ser usados em outras funções. Os parâmetros só podem assumir o lugar de constantes. Eles não podem ser usados no lugar de nomes de tabela, nomes de coluna ou nomes de outros objetos de banco de dados.

Observação

ANSI_WARNINGS não é respeitado quando você passa parâmetros em um procedimento armazenado, função definida pelo usuário ou quando declara e define variáveis em uma instrução em lote. Por exemplo, se a variável for definida como char(3) e, em seguida, configurada com um valor maior que três caracteres, os dados serão truncados até o tamanho definido e a instrução INSERT ou UPDATE terá êxito.

parameter_data_type

O tipo de dados de parâmetro. Para funções Transact-SQL, todos os tipos de dados escalares compatíveis com o Azure Synapse Analytics são permitidos. O tipo de dados de carimbo de data/hora (rowversion) não é um tipo compatível.

[ = padrão ]

Um valor padrão para o parâmetro. Se um valor default for definido, a função poderá ser executada sem a necessidade de especificar um valor para esse parâmetro.

Quando um parâmetro da função tiver um valor padrão, a palavra-chave DEFAULT deverá ser especificada quando a função for chamada para recuperar o valor padrão. Esse comportamento é diferente do uso de parâmetros com valores padrão em procedimentos armazenados nos quais a omissão do parâmetro também indica o valor padrão.

return_data_type

O valor retornado de uma função escalar definida pelo usuário. Para funções Transact-SQL, todos os tipos de dados escalares compatíveis com o Azure Synapse Analytics são permitidos. O tipo de dados de carimbo de data/hora rowversion/não é um tipo compatível. Os tipos não escalares de cursor e tabela não são permitidos.

function_body

Série de instruções Transact-SQL. O function_body não pode conter uma SELECT instrução e não pode referenciar dados de banco de dados. O function_body não pode fazer referência a tabelas ou exibições. O corpo da função pode chamar outras funções determinísticas, mas não pode chamar funções não determinísticas.

Em funções escalares, function_body é uma série de instruções Transact-SQL que juntas são avaliadas para um valor escalar.

scalar_expression

Especifica o valor escalar que a função escalar retorna.

select_stmt

A única SELECT instrução que define o valor retornado de uma função embutida com valor de tabela. Para uma função embutida com valor de tabela, não há corpo de função; A tabela é o conjunto de resultados de uma única SELECT instrução.

TABELA

Especifica que o valor retornado da TVF (função com valor de tabela) é uma tabela. Somente constantes e @local_variables podem ser passadas para TVFs.

Em TVFs embutidos (versão prévia), o valor retornado TABLE é definido por meio de uma única SELECT instrução. As funções embutidas não têm variáveis de retorno associadas.

<function_option>

Especifica que a função tem uma ou mais das opções a seguir.

SCHEMABINDING

Especifica que a função está associada aos objetos de banco de dados referenciados por ela. Quando SCHEMABINDING for especificado, os objetos base não poderão ser modificadas de um modo que possa afetar a definição da função. A própria definição da função deve ser primeiro modificada ou descartada para remover as dependências no objeto a ser modificado.

A associação da função aos objetos referenciados por ela será removida somente quando ocorrer uma das ações a seguir:

  • A função for descartada.

  • A função for modificada com o uso da instrução ALTER sem a especificação da opção SCHEMABINDING.

Uma função poderá ser associada a esquemas apenas se as condições a seguir forem verdadeiras:

  • As funções definidas pelo usuário referenciadas pela função também são associadas a esquema.

  • As funções e outras UDFs referenciadas pela função são referenciadas usando um nome de uma ou duas partes.

  • Somente funções internas e outras UDFs no mesmo banco de dados podem ser referenciadas no corpo de UDFs.

  • O usuário que executou a instrução tem a CREATE FUNCTION permissão REFERENCES nos objetos de banco de dados aos quais a função faz referência.

Para remover SCHEMABINDING, use ALTER.

RETORNA NULO NA ENTRADA NULA | CHAMADO NA ENTRADA NULA

Especifica o OnNULLCall atributo de uma função com valor escalar. Se não for especificado, CALLED ON NULL INPUT está implícito por padrão e o corpo da função é executado mesmo se NULL for passado como um argumento.

Práticas recomendadas

Se uma função definida pelo usuário não for criada com a cláusula SCHEMABINDING, as alterações feitas nos objetos subjacentes poderão afetar a definição da função e produzir resultados inesperados quando ela for chamada. É recomendável especificar a WITH SCHEMABINDING cláusula ao criar a função. Isso garante que os objetos referenciados na definição da função não possam ser modificados, a menos que a função também seja modificada.

Interoperabilidade

As seguintes instruções são válidas em uma função de valor escalar:

  • Instruções de atribuição.

  • Instruções de controle de fluxo com exceção das instruções TRY...CATCH.

  • Instruções DECLARE que definem variáveis de dados locais.

Em uma função com valor de tabela embutida (versão prévia), é permitida apenas uma instrução SELECT.

Limitações

Funções definidas pelo usuário não podem ser usadas para executar ações que modificam o estado do banco de dados.

Funções definidas pelo usuário podem ser aninhadas, isto é, uma função definida pelo usuário pode chamar outra. O nível de aninhamento é incrementado quando a execução da função é iniciada, e reduzido quando a execução da função chamada é concluída. Se o máximo de níveis de aninhamento for excedido haverá falha em toda a cadeia de funções da chamada de aninhamento.

Objetos, incluindo funções, não podem ser criados no banco de dados master do pool de SQL sem servidor no Azure Synapse Analytics.

Metadados

Esta seção lista as exibições do catálogo do sistema que podem ser usadas para retornar metadados sobre funções definidas pelo usuário.

  • sys.sql_modules: exibe a definição de Transact-SQL funções definidas pelo usuário. Por exemplo:

    SELECT definition, type   
    FROM sys.sql_modules AS m  
    JOIN sys.objects AS o   
        ON m.object_id = o.object_id   
        AND type = ('FN');
    
  • sys.parameters: exibe informações sobre os parâmetros definidos em funções definidas pelo usuário.

  • sys.sql_expression_dependencies: exibe os objetos subjacentes referenciados por uma função.

Permissões

Requer a permissão CREATE FUNCTION no banco de dados e a permissão ALTER no esquema no qual a função está sendo criada.

Exemplos

R. Usar uma função definida pelo usuário com valor escalar para alterar um tipo de dados

Essa função simples usa um tipo de dados int como uma entrada e retorna um tipo de dados decimal(10,2) como uma saída.

CREATE FUNCTION dbo.ConvertInput (@MyValueIn int)  
RETURNS decimal(10,2)  
AS  
BEGIN
    DECLARE @MyValueOut int;  
    SET @MyValueOut= CAST( @MyValueIn AS decimal(10,2));  
    RETURN(@MyValueOut);  
END;  
GO  

SELECT dbo.ConvertInput(15) AS 'ConvertedValue';  

Observação

As funções escalares não estão disponíveis nos pools de SQL sem servidor.

B. Criar uma função com valor de tabela embutida

O exemplo a seguir cria uma função com valor de tabela embutida para retornar algumas informações importantes sobre módulos, filtrando pelo parâmetro objectType. Ele inclui um valor padrão para retornar todos os módulos quando a função é chamada com o DEFAULT parâmetro. Este exemplo usa algumas das exibições do catálogo do sistema mencionadas em Metadados.

CREATE FUNCTION dbo.ModulesByType(@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN
(
    SELECT 
        sm.object_id AS 'Object Id',
        o.create_date AS 'Date Created',
        OBJECT_NAME(sm.object_id) AS 'Name',
        o.type AS 'Type',
        o.type_desc AS 'Type Description', 
        sm.definition AS 'Module Description'
    FROM sys.sql_modules AS sm  
    JOIN sys.objects AS o ON sm.object_id = o.object_id
    WHERE o.type like '%' + @objectType + '%'
);
GO

Em seguida, a função pode ser chamada para retornar todos os objetos de exibição comV:

select * from dbo.ModulesByType('V');

Observação

As funções de valor de tabela em linha estão disponíveis nos pools de SQL sem servidor, mas em versão prévia nos pools de SQL dedicados.

C. Combinar resultados de uma função com valor de tabela embutida

Este exemplo simples usa o TVF embutido criado anteriormente para demonstrar como é possível combinar os resultados com outras tabelas usando Cross Apply. Aqui, selecionamos todas as colunas de ambas sys.objects e os resultados de ModulesByType todas as linhas correspondentes na type coluna. Para obter mais informações sobre como usar aplicar, consulte a cláusula FROM mais JOIN, APPLY, PIVOT (Transact-SQL).

SELECT * 
FROM sys.objects o
CROSS APPLY dbo.ModulesByType(o.type);
GO

Observação

As funções de valor de tabela em linha estão disponíveis nos pools de SQL sem servidor, mas em versão prévia nos pools de SQL dedicados.

Próxima etapa