Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Introduzione alle funzioni inline con valori di tabella (ITVF) in SQL Server

In SQL Server, la funzione con valori di tabella inline è uno dei due tipi di funzioni Transact-SQL con valori di tabella (l'altro tipo è la funzione con valori di tabella a più istruzioni).

Le funzioni con valori di tabella (TVF) sono un tipo di funzione definita dall'utente che restituisce i risultati sotto forma di tabella. Possono quindi essere interrogati proprio come un normale tavolo.

I TVF in linea (a volte indicati come ITVF) non hanno variabili di ritorno associate. Il valore di ritorno è definito tramite un singolo SELECT dichiarazione. Questa istruzione definisce la struttura della tabella di ritorno. Ciò è in contrasto con le TVF con più istruzioni (chiamate anche MSTVF), che richiedono una variabile di ritorno.

Inoltre, gli ITVF non utilizzano BEGIN /END sintassi, che è un'altra cosa che li distingue dai MSTVF.

I TVF in linea sono spesso considerati avere prestazioni migliori rispetto ai TVF multi-istruzione, anche se questo dipenderà anche da ciò che stai cercando di fare nella funzione.

Esempio di funzione inline con valori di tabella

Ecco un esempio di ITVF di base:

CREATE FUNCTION dbo.ufn_AlbumsByArtist(@ArtistId int)
RETURNS TABLE
AS
RETURN (  
    SELECT 
      al.ArtistId,
      al.AlbumName,
      g.Genre
    FROM dbo.Albums al 
      INNER JOIN dbo.Artists ar 
        ON al.ArtistId = ar.ArtistId
      INNER JOIN Genres g
        ON al.GenreId = g.GenreId
    WHERE al.ArtistId = @ArtistId
);

GO

Fondamentalmente consiste in un SELECT istruzione racchiusa in un altro codice. Per renderlo specificamente un inline TVF, ho avviato la funzione con RETURNS TABLE , seguito da vicino da RETURN e termina con un SELECT frase tra parentesi.

Dichiarazioni multiple

Sebbene le funzioni inline con valori di tabella non siano progettate per più SELECT (ecco a cosa servono gli MSTVF), è possibile utilizzare il UNION operatore per combinare il set di risultati di più istruzioni.

Esempio:

CREATE FUNCTION [dbo].[udf_PetsByName_ITVF]( @PetName varchar(70))
    RETURNS TABLE 
AS
RETURN (
    SELECT 
        CONCAT('Cat', ' ', CatId) AS PetId,
        CatName
    FROM dbo.Cats
    WHERE CatName = @PetName

    UNION ALL

    SELECT 
        CONCAT('Dog', ' ', DogId) AS PetId,
        DogName
    FROM dbo.Dogs
    WHERE DogName = @PetName
    );

GO

Opzioni funzione

Puoi anche specificare cose come, se usare o meno il binding dello schema (probabilmente dovresti) e se crittografare o meno la funzione.

Il binding dello schema impedirà che vengano apportate modifiche negative agli oggetti sottostanti da cui dipende la funzione (come l'eliminazione di una tabella, la modifica di una colonna, ecc.).

La crittografia convertirà la definizione della funzione in un formato offuscato (per impedire ad altri di leggerla).

Consulta Creare una funzione inline con valori di tabella per esempi di aggiunta di associazione di schemi e crittografia a un ITVF.