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

Introduzione alle funzioni multi-istruzioni con valori di tabella (MSTVF) in SQL Server

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

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 a più istruzioni (a volte indicati come MSTVF) possono essere costituiti da più istruzioni, i cui risultati sono archiviati in una variabile di ritorno. Includere le specifiche della variabile di ritorno nella parte superiore della funzione. Questo specifica la struttura della tabella di ritorno. In altre parole, specifichi quante colonne, i loro nomi, i tipi di dati, ecc.

Ciò è in contrasto con i TVF inline (indicati anche come ITVF), che non utilizzano una variabile di ritorno (la tabella di ritorno è definita da SELECT dichiarazione).

Gli MSTVF usano anche BEGIN /END sintassi, che è un'altra cosa che li distingue dagli ITVF (gli ITVF non usano quella sintassi).

Esempio di funzione con valori di tabella a più istruzioni

Ecco un esempio di MSTVF di base:

CREATE FUNCTION dbo.udf_PetsByName_MSTVF( @PetName varchar(70))
    RETURNS @pets TABLE (
        PetId varchar(20),
        PetName varchar(70)
    )
AS
BEGIN
    INSERT INTO @pets
    SELECT 
        CONCAT('Cat', ' ', CatId),
        CatName
    FROM dbo.Cats
    WHERE CatName = @PetName;

    INSERT INTO @pets
    SELECT 
        CONCAT('Dog', ' ', DogId),
        DogName
    FROM dbo.Dogs
    WHERE DogName = @PetName;

    IF @@ROWCOUNT = 0
    BEGIN
        INSERT INTO @pets
        VALUES (
            '',
            'There are no pets of that name.'
            )
    END

    RETURN;
END;

GO

Qui inizio la funzione definendo la variabile di ritorno chiamata @pets . È di tipo tabella e restituirà due colonne.

In questo caso ho due SELECT istruzioni e un IF dichiarazione. I risultati di ciascuno sono memorizzati nella variabile di ritorno. Questo viene fatto tramite un INSERT dichiarazione ogni volta.

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 multivalore con valori di tabella per esempi di aggiunta di associazione e crittografia di schemi a un ITVF.