Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:Ponto de extremidade de análise SQL e Armazém no Microsoft Fabric
CREATE FUNCTION pode criar funções de valor de tabela embutidas e funções escalares.
Observação
As UDFs escalares são um recurso de visualização no Fabric Data Warehouse.
Importante
No Fabric Data Warehouse, UDFs escalares devem ser inalinháveis para uso com SELECT ... FROM consultas em tabelas de usuário, mas você ainda pode criar funções que não são inlineáveis. UDFs escalares que não são inlineable funcionam em um número limitado de cenários. Você pode verificar se um UDF pode ser embutido.
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 uma cadeia de caracteres. Funções com valor de tabela definidas pelo usuário (TVFs) retornam uma tabela.
Use CREATE FUNCTION para criar uma rotina T-SQL reutilizável que pode ser usada das seguintes maneiras:
- Em Transact-SQL declarações como
SELECT - Em Transact-SQL declarações de manipulação de dados (DML), como
UPDATE,INSERTeDELETE - Em aplicativos que chamam a função
- Na definição de outra função definida pelo utilizador
- Para substituir um procedimento armazenado
Sugestão
Você pode especificar CREATE OR ALTER FUNCTION para criar uma nova função se uma não existir por esse nome, ou alterar uma função existente, em uma única instrução.
Transact-SQL convenções de sintaxe
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 da função com valor de tabela embutido
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ção devem estar em conformidade com as regras para identificadores e devem ser exclusivos dentro do banco de dados e para seu esquema.
Observação
Parênteses são necessários após o nome da função, mesmo que um parâmetro não seja especificado.
@ parameter_name
Um parâmetro na função definida pelo usuário. Um ou mais parâmetros podem ser declarados.
Uma função pode ter um máximo de 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 um padrão para o parâmetro seja definido.
Especifique um nome de parâmetro usando um sinal de arroba (@) como o primeiro caractere. O nome do parâmetro deve estar em conformidade com as regras para identificadores. Os parâmetros são locais para a função; Os mesmos nomes de parâmetros podem ser usados em outras funções. Os parâmetros podem tomar o lugar apenas de constantes; Eles não podem ser usados em vez de nomes de tabela, nomes de coluna ou nomes de outros objetos de banco de dados.
Observação
ANSI_WARNINGS não é honrado 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 batch. Por exemplo, se uma variável for definida como char(3) e, em seguida, definida como um valor maior que três caracteres, os dados serão truncados para o tamanho definido e a instrução INSERT ou UPDATE será bem-sucedida.
parameter_data_type
O tipo de dados do parâmetro. Para funções Transact-SQL, todos os tipos de dados escalares suportados são permitidos .
[ = padrão ]
Um valor padrão para o parâmetro. Se um valor padrão for definido, a função pode ser executada sem 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 em que omitir o parâmetro também implica o valor padrão.
return_data_type
O valor de retorno 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 ocarimbo de data/hora/ de linha. Tipos não escalares como tabela não são permitidos.
function_body
Uma série de declarações Transact-SQL.
Em funções escalares, function_body é uma série de Transact-SQL instruções que, juntas, avaliam até um valor escalar, que pode incluir:
- Expressão de instrução única
- Expressões com várias instruções (
IF/THEN/ELSEeBEGIN/ENDblocos) - Variáveis locais
- Chamadas para funções SQL incorporadas disponíveis
- Chamadas para outras UDFs
-
SELECTinstruções e referências a tabelas, exibições e funções com valor de tabela embutido
scalar_expression
Especifica o valor escalar que a função escalar retorna.
select_stmt
A instrução única SELECT que define o valor de retorno de uma função com valor de tabela embutido. 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 SELECT instrução.
TABELA
Especifica que o valor de retorno da função com valor de tabela (TVF) é uma tabela. Apenas constantes e @local_variables podem ser passadas para TVFs.
Em TVFs embutidos (visualização), o valor de retorno 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, as INLINEpalavras-chave , ENCRYPTIONe EXECUTE AS não são suportadas.
As opções de função suportadas incluem:
SCHEMABINDING
Especifica que a função está vinculada aos objetos de banco de dados aos quais faz referência. Quando SCHEMABINDING é especificado, os objetos base não podem ser modificados de uma forma que afetaria a definição da função. A própria definição de função deve primeiro ser modificada ou descartada para remover dependências no objeto a ser modificado.
A associação da função aos objetos aos quais ela faz referência é removida somente quando ocorre uma das seguintes ações:
A função é descartada.
A função é modificada usando a instrução ALTER com a opção SCHEMABINDING não especificada.
Uma função pode ser vinculada ao esquema somente se as seguintes condições forem verdadeiras:
Todas as funções definidas pelo usuário referenciadas pela função também são vinculadas ao 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 dentro do corpo de UDFs.
O usuário que executou a instrução tem permissão
CREATE FUNCTIONREFERENCES nos objetos de banco de dados aos quais a função faz referência.
Para remover SCHEMABINDING, use ALTER.
DEVOLVE NULL NA ENTRADA NULA | CHAMADA NA ENTRADA NULA
Especifica o OnNULLCall atributo de uma função com valor escalar. Se não for especificado, CALLED ON NULL INPUT é implícito por padrão, e o corpo da função é executado mesmo se NULL for passado como um argumento.
Melhores práticas
Se uma função definida pelo usuário não for criada com schemabinding, as alterações feitas nos objetos subjacentes podem afetar a definição da função e produzir resultados inesperados quando ela for invocada. É recomendável especificar a
WITH SCHEMABINDINGcláusula quando você estiver criando a função. Isso garante que os objetos referenciados na definição de 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 inalinháveis. Para obter mais informações, consulte Scalar UDF inlining.
Interoperabilidade
Funções definidas pelo usuário com valor de tabela embutido
Em uma função com valor de tabela embutido, apenas uma única instrução select é permitida.
Funções escalares definidas pelo usuário
As instruções a seguir são válidas em uma função de valor escalar:
- Declarações de atribuição
- Instruções de controle de fluxo, exceto
TRY...CATCHinstruções -
DECLAREinstruções que definem variáveis de dados locais
As seguintes funções internas não são suportadas em um corpo de função com valor escalar:
UDFs escalares não podem ser usadas em uma
SELECT ... FROMconsulta em uma tabela de usuário quando:- O corpo UDF contém uma chamada para função interna não determinística, consulte Funções determinísticas e não determinísticas.
- O corpo UDF contém uma expressão de tabela comum (CTE).
- O corpo UDF contém corpo UDF multi-instrução além de seis
IF-THEN-ELSEblocos. - O corpo UDF contém um WHILE LOOP
- O corpo da UDF não pode ser embutido por outras razões. Para obter mais informações, consulte Requisitos de inlining UDF escalar.
UDFs escalares não podem ser usadas em uma consulta quando:
- UDF é chamado diretamente em uma
GROUP BYcláusula. - UDF é chamado diretamente em uma
ORDER BYcláusula. - chamar consulta tem uma expressão de tabela comum (CTE).
- UDF é chamado diretamente em uma
UDFs escalares recursivas não são suportadas.
Uma consulta de usuário pode falhar se mais de 10 chamadas UDF forem feitas em uma única consulta.
Em alguns casos de borda, a complexidade da consulta do usuário e do corpo UDF impede o inlining, caso em que o UDF escalar não está embutido e a consulta do usuário falha.
Quando um UDF escalar é usado 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 visualização atual, as limitações estão sujeitas a alterações.
As funções definidas pelo usuário não podem ser usadas para executar ações que modifiquem o estado do banco de dados.
As funções definidas pelo usuário podem ser aninhadas; ou seja, uma função definida pelo usuário pode chamar outra. O nível de aninhamento é incrementado quando a função chamada inicia a execução e diminuído quando a função chamada termina a execução. 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 de tabela/exibição/em linha, ou até 32 níveis caso contrário. Exceder os níveis máximos de aninhamento faz com que a cadeia de funções chamadoras falhe.
Metadados
Esta seção lista as exibições do catálogo do sistema que você pode usar 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
Os membros das funções de Administrador, Membro e Colaborador do espaço de trabalho Malha podem criar funções.
Inlining de UDF escalar
O Microsoft Fabric Data Warehouse usa inlining UDF escalar para compilar e executar código definido pelo usuário de forma distribuída. O inlining UDF escalar está habilitado por padrão.
Enquanto o inlining UDF escalar é 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 suportados. No Fabric Data Warehouse, UDFs escalares são automaticamente transformadas em expressões escalares ou subconsultas escalares que são substituídas na consulta de chamada no lugar do operador UDF.
Algumas sintaxes T-SQL tornam um UDF escalar não inlineável. As funções que contêm um WHILE loop, várias RETURN instruções ou uma chamada para uma função interna SQL não determinística (como GETUTCDATE() ou GETDATE()) não podem ser embutidas. Para obter mais informações, consulte Requisitos de inlining UDF escalar.
Verifique se uma UDF escalar pode ser embutida
A sys.sql_modules exibição de catálogo inclui a coluna is_inlineable, que indica se um UDF é inlineável.
A is_inlineable propriedade é derivada da verificação da sintaxe dentro da definição UDF. O UDF escalar não é embutido antes do tempo de compilação. Um valor de 1 indica que a UDF é inlineável, enquanto um valor de 0 indica que ela não é inlineável. Se um UDF escalar for inlineável, isso não garante que ele sempre será embutido quando a consulta for compilada.
O Fabric Data Warehouse decide (por consulta) se deseja inserir um UDF, dependendo da complexidade geral da consulta.
Use a seguinte consulta de exemplo para verificar se um UDF escalar é inlineável:
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 inlineável no 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 amostra dbo.custom_SYSUTCDATETIME definida pelo usuário não é inlineável 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
Um. Criar uma função com valor de tabela embutido
O exemplo a seguir cria uma função com valor de tabela embutido para retornar algumas informações importantes sobre módulos, filtrando pelo objectType parâmetro. 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
A função pode então ser chamada para retornar todas as funções com valor de tabela embutido (IF) com:
SELECT * FROM dbo.ModulesByType('IF'); -- SQL_INLINE_TABLE_VALUED_FUNCTION
Ou, localize 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 embutido
Este exemplo simples usa o TVF embutido criado anteriormente para demonstrar como seus resultados podem ser combinados com outras tabelas usando aplicação cruzada. 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 apply, consulte FROM clause plus 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 um UDF escalar inlineável 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 comunicado SELECT :
SELECT TOP 10
t.id, t.name,
dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t;
WHERE Numa 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'
JOIN Numa 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);
ORDER BY Numa cláusula:
SELECT t.id, t.name, dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t
ORDER BY function_output;
Em declarações de linguagem de manipulação de dados (DML) 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';
Conteúdo relacionado
Cria uma função definida pelo usuário (UDF) no Azure Synapse Analytics ou no Analytics Platform System (PDW). 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 com valor de tabela (TVFs) definidas pelo usuário retornam um tipo de dados de tabela.
Sugestão
Para sintaxe no Fabric Data Warehouse, veja a versão do CREATE FUNCTION para o Fabric Data Warehouse.
No Analytics Platform System (PDW), o valor de retorno deve ser um valor escalar (único).
No Azure Synapse Analytics,
CREATE FUNCTIONpode retornar uma tabela usando a sintaxe para funções com valor de tabela embutido (visualização) ou pode retornar um único valor usando a sintaxe para funções escalares.Em pools SQL sem servidor no Azure Synapse Analytics, pode criar funções de valor de tabela embutidas,
CREATE FUNCTIONmas não funções escalares.Use esta instrução para criar uma rotina reutilizável que pode ser usada das seguintes maneiras:
Em Transact-SQL declarações como
SELECTEm aplicativos que chamam a função
Na definição de outra função definida pelo utilizador
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 diretiva de segurança
Transact-SQL convenções de sintaxe
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 da função com valor de tabela embutido
-- 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ção devem estar em conformidade com as regras para identificadores e devem ser exclusivos dentro do banco de dados e para seu esquema.
Observação
Parênteses são necessários após o nome da função, mesmo que um parâmetro não seja especificado.
@ parameter_name
Um parâmetro na função definida pelo usuário. Um ou mais parâmetros podem ser declarados.
Uma função pode ter um máximo de 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 um padrão para o parâmetro seja definido.
Especifique um nome de parâmetro usando um sinal de arroba (@) como o primeiro caractere. O nome do parâmetro deve estar em conformidade com as regras para identificadores. Os parâmetros são locais para a função; Os mesmos nomes de parâmetros podem ser usados em outras funções. Os parâmetros podem tomar o lugar apenas de constantes; Eles não podem ser usados em vez de nomes de tabela, nomes de coluna ou nomes de outros objetos de banco de dados.
Observação
ANSI_WARNINGS não é honrado 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 batch. Por exemplo, se uma variável for definida como char(3) e, em seguida, definida como um valor maior que três caracteres, os dados serão truncados para o tamanho definido e a instrução INSERT ou UPDATE será bem-sucedida.
parameter_data_type
O tipo de dados do parâmetro. Para funções Transact-SQL, todos os tipos de dados escalares suportados no Azure Synapse Analytics são permitidos. O tipo de dados timestamp (rowversion) não é um tipo suportado.
[ = padrão ]
Um valor padrão para o parâmetro. Se um valor padrão for definido, a função pode ser executada sem 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 em que omitir o parâmetro também implica o valor padrão.
return_data_type
O valor de retorno de uma função escalar definida pelo usuário. Para funções Transact-SQL, todos os tipos de dados escalares suportados no Azure Synapse Analytics são permitidos. O tipo de dados decarimbo de data/hora/ não é um tipo suportado. Os tipos não escalares de cursor e tabela não são permitidos.
function_body
Série de declarações Transact-SQL. O function_body não pode conter uma SELECT instrução e não pode fazer referência a dados do 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 Transact-SQL instruções que, juntas, avaliam até um valor escalar.
scalar_expression
Especifica o valor escalar que a função escalar retorna.
select_stmt
A instrução única SELECT que define o valor de retorno de uma função com valor de tabela embutido. 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 SELECT instrução.
TABELA
Especifica que o valor de retorno da função com valor de tabela (TVF) é uma tabela. Apenas constantes e @local_variables podem ser passadas para TVFs.
Em TVFs embutidos (visualização), o valor de retorno 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 seguintes opções.
SCHEMABINDING
Especifica que a função está vinculada aos objetos de banco de dados aos quais faz referência. Quando SCHEMABINDING é especificado, os objetos base não podem ser modificados de uma forma que afetaria a definição da função. A própria definição de função deve primeiro ser modificada ou descartada para remover dependências no objeto a ser modificado.
A associação da função aos objetos aos quais ela faz referência é removida somente quando ocorre uma das seguintes ações:
A função é descartada.
A função é modificada usando a instrução ALTER com a opção SCHEMABINDING não especificada.
Uma função pode ser vinculada ao esquema somente se as seguintes condições forem verdadeiras:
Todas as funções definidas pelo usuário referenciadas pela função também são vinculadas ao esquema.
As funções e outros UDFs referenciados pela função são referenciados usando um nome de uma ou duas partes.
Somente funções internas e outras UDFs no mesmo banco de dados podem ser referenciadas dentro do corpo de UDFs.
O usuário que executou a instrução tem permissão
CREATE FUNCTIONREFERENCES nos objetos de banco de dados aos quais a função faz referência.
Para remover SCHEMABINDING, use ALTER.
DEVOLVE NULL NA ENTRADA NULA | CHAMADA NA ENTRADA NULA
Especifica o OnNULLCall atributo de uma função com valor escalar. Se não for especificado, CALLED ON NULL INPUT é implícito por padrão, e o corpo da função é executado mesmo se NULL for passado como um argumento.
Melhores práticas
Se uma função definida pelo usuário não for criada com a cláusula SCHEMABINDING, as alterações feitas nos objetos subjacentes podem afetar a definição da função e produzir resultados inesperados quando ela for invocada. É recomendável especificar a WITH SCHEMABINDING cláusula quando você estiver criando a função. Isso garante que os objetos referenciados na definição de função não possam ser modificados, a menos que a função também seja modificada.
Interoperabilidade
As instruções a seguir são válidas em uma função de valor escalar:
Declarações de atribuição.
Instruções Control-of-Flow, exceto TRY... Declarações CATCH.
Instruções DECLARE que definem variáveis de dados locais.
Em uma função com valor de tabela embutido (visualização), apenas uma única instrução select é permitida.
Limitações
As funções definidas pelo usuário não podem ser usadas para executar ações que modifiquem o estado do banco de dados.
As funções definidas pelo usuário podem ser aninhadas; ou seja, uma função definida pelo usuário pode chamar outra. O nível de aninhamento é incrementado quando a função chamada inicia a execução e diminuído quando a função chamada termina a execução. Exceder os níveis máximos de aninhamento faz com que toda a cadeia de funções chamadoras falhe.
Objetos, incluindo funções, não podem ser criados no banco de dados do master seu pool SQL sem servidor no Azure Synapse Analytics.
Metadados
Esta seção lista as exibições do catálogo do sistema que você pode usar 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
Um. Usar uma função definida pelo usuário com valor escalar para alterar um tipo de dados
Esta 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 SQL sem servidor.
B. Criar uma função com valor de tabela embutido
O exemplo a seguir cria uma função com valor de tabela embutido para retornar algumas informações importantes sobre módulos, filtrando pelo objectType parâmetro. 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
A função pode então ser chamada para retornar todos os objetos de exibição (V) com:
select * from dbo.ModulesByType('V');
Observação
As funções de valor de tabela embutidas estão disponíveis nos pools SQL sem servidor, mas em visualização nos pools SQL dedicados.
C. Combinar resultados de uma função com valor de tabela embutido
Este exemplo simples usa o TVF embutido criado anteriormente para demonstrar como seus resultados podem ser combinados com outras tabelas usando aplicação cruzada. 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 apply, consulte FROM clause plus 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 embutidas estão disponíveis nos pools SQL sem servidor, mas em visualização nos pools SQL dedicados.