Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Créer une fonction de table en ligne (ITVF) dans SQL Server

Vous pouvez créer une fonction table en ligne (ITVF) dans SQL Server à l'aide de T-SQL CREATE FUNCTION syntaxe.

Syntaxe

Voici la syntaxe officielle des TVF en ligne.

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 [ ) ]  
[ ; ]  

Exemple 1 – ITVF de base

Voici un exemple de fonction de table en ligne de base.

CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
    RETURNS TABLE
AS
RETURN (
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @CatName
    );

GO

Dans ce cas, la fonction nécessite qu'un nom de chat soit passé en argument. Il utilise ensuite cet argument dans la requête afin de renvoyer les données pertinentes.

Exemple 2 – Ajouter une liaison de schéma

C'est généralement une bonne idée de lier le schéma de vos fonctions en utilisant le SCHEMABINDING argument.

Cela garantira que les tables sous-jacentes ne peuvent pas être modifiées d'une manière qui affecterait votre fonction.

Sans liaison de schéma, les tables sous-jacentes pourraient être modifiées ou même supprimées. Cela pourrait casser la fonction.

Voici la même fonction, mais cette fois avec une liaison de schéma :

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

Remarquez que j'ai utilisé le nom en deux parties lors du référencement de la table dans ma requête (j'ai utilisé dbo.Cats lors de la référence à la table, au lieu de simplement Cats ). Cela est une exigence pour le schéma de liaison d'un objet. Si vous essayez de lier un objet au schéma sans utiliser de noms en deux parties, vous obtiendrez une erreur.

Maintenant que j'ai lié le schéma de ma fonction, si j'essaie de supprimer la table référencée dans sa définition, j'obtiens une erreur :

DROP TABLE Cats;

Résultat :

Msg 3729, Level 16, State 1, Line 1
Cannot DROP TABLE 'cats' because it is being referenced by object 'udf_CatsByName_ITVF'.

Au fait, voici ce qui se passe si j'essaie de créer la fonction sans utiliser de nommage en deux parties :

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

Résultat :

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.

Exemple 3 – Ajouter un chiffrement

Vous pouvez également chiffrer vos fonctions en utilisant le ENCRYPTION argument.

Voici un exemple de chiffrement de la fonction :

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

Je ne parviens plus à afficher la définition de la fonction.

SELECT definition 
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');

Résultat :

+--------------+
| definition   |
|--------------|
| NULL         |
+--------------+

Je reçois également un message d'erreur lorsque j'essaie de scripter la définition de la fonction via Azure Data Studio :

No script was returned when scripting as Create on object UserDefinedFunction

Notez que le texte d'une fonction chiffrée est toujours disponible pour les utilisateurs privilégiés qui peuvent soit accéder aux tables système via le port DAC, soit accéder directement aux fichiers de la base de données. De plus, les utilisateurs qui peuvent attacher un débogueur au processus serveur peuvent récupérer la procédure d'origine de la mémoire lors de l'exécution.