Você pode criar uma função com valor de tabela embutido (ITVF) no SQL Server usando o T-SQL
CREATE FUNCTION
sintaxe. Sintaxe
Aqui está a sintaxe oficial para TVFs inline.
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ = default ] [ READONLY ] } [ ,...n ] ] ) RETURNS TABLE [ WITH <function_option> [ ,...n ] ] [ AS ] RETURN [ ( ] select_stmt [ ) ] [ ; ]
Exemplo 1 – ITVF básico
Aqui está um exemplo de uma função básica com valor de tabela embutida.
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Nesse caso, a função requer que um nome de gato seja passado como argumento. Em seguida, ele usa esse argumento na consulta para retornar os dados relevantes.
Exemplo 2 – Adicionar vinculação de esquema
Geralmente é uma boa ideia vincular suas funções usando o método
SCHEMABINDING
argumento. Fazer isso garantirá que as tabelas subjacentes não possam ser alteradas de uma maneira que afete sua função.
Sem a associação de esquema, as tabelas subjacentes podem ser modificadas ou até mesmo excluídas. Fazer isso pode quebrar a função.
Aqui está a mesma função, mas desta vez com vinculação de esquema:
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Observe que usei o nome de duas partes ao fazer referência à tabela em minha consulta (usei
dbo.Cats
ao fazer referência à tabela, em vez de apenas Cats
). Fazer isso é um requisito para o esquema vincular um objeto. Se você tentar vincular um objeto ao esquema sem usar nomes de duas partes, receberá um erro. Agora que vinculei minha função ao esquema, se eu tentar descartar a tabela referenciada em sua definição, recebo um erro:
DROP TABLE Cats;
Resultado:
Msg 3729, Level 16, State 1, Line 1 Cannot DROP TABLE 'cats' because it is being referenced by object 'udf_CatsByName_ITVF'.
A propósito, aqui está o que acontece se eu tentar criar a função sem usar nomenclatura de duas partes:
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING AS RETURN ( SELECT CatId, CatName, Phone FROM Cats WHERE CatName = @CatName ); GO
Resultado:
Msg 4512, Level 16, State 3, Procedure udf_CatsByName_ITVF, Line 7 Cannot schema bind table valued function 'dbo.udf_CatsByName_ITVF' because name 'Cats' is invalid for schema binding. Names must be in two-part format and an object cannot reference itself.
Exemplo 3 – Adicionar criptografia
Você também pode criptografar suas funções usando a
ENCRYPTION
argumento. Aqui está um exemplo de criptografia da função:
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING, ENCRYPTION AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Agora não consigo visualizar a definição da função.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Resultado:
+--------------+ | definition | |--------------| | NULL | +--------------+
Também recebo uma mensagem de erro ao tentar fazer o script da definição da função por meio do Azure Data Studio:
No script was returned when scripting as Create on object UserDefinedFunction
Observe que o texto de uma função criptografada ainda está disponível para usuários privilegiados que podem acessar as tabelas do sistema pela porta DAC ou acessar diretamente os arquivos do banco de dados. Além disso, os usuários que podem anexar um depurador ao processo do servidor podem recuperar o procedimento original da memória em tempo de execução.