Nozioni fondamentali sulle funzioni definite dall'utente

In maniera simile alle funzioni dei linguaggi di programmazione, le funzioni definite dall'utente di Microsoft SQL Server sono routine che accettano parametri, eseguono un'azione (ad esempio un calcolo complesso) e restituiscono il risultato dell'azione sotto forma di valore. Il valore restituito può essere un valore scalare singolo o un set di risultati.

Vantaggi delle funzioni definite dall'utente

Di seguito vengono elencati i vantaggi delle funzioni definite dall'utente in SQL Server.

  • Consentono la programmazione modulare.

    È possibile creare la funzione una sola volta, archiviarla nel database e richiamarla nel programma tutte le volte che si desidera. Le funzioni definite dall'utente possono essere modificate in maniera indipendente dal codice sorgente del programma.

  • Consentono tempi di esecuzione più rapidi.

    In maniera simile alle stored procedure, le funzioni definite dall'utente in Transact-SQL riducono le risorse necessarie per la compilazione di codice Transact-SQL memorizzando nella cache e riutilizzando i piani per esecuzioni ripetute. Ciò significa che una funzione definita dall'utente non deve essere analizzata e ottimizzata nuovamente ogni volta che viene utilizzata, con una conseguente e sensibile riduzione dei tempi di esecuzione.

    Le funzioni CLR offrono un significativo vantaggio nelle prestazioni rispetto alle funzioni Transact-SQL per le attività di calcolo, modifica delle stringhe e logiche di business. Al contrario, le funzioni Transact-SQL sono più adatte a logica che prevede un accesso intensivo ai dati.

  • Consentono di ridurre il traffico di rete.

    È possibile esprimere in una funzione un'operazione che filtra i dati sulla base di un vincolo complesso che non è possibile esprimere in una singola espressione scalare. È quindi possibile richiamare la funzione nella clausola WHERE per ridurre il numero delle righe inviate al client.

Nota

Le funzioni Transact-SQL definite dall'utente nelle query possono essere eseguite solo su un solo thread (piano di esecuzione seriale).

Componenti di una funzione definita dall'utente

Le funzioni definite dall'utente possono essere scritte in Transact-SQL o in qualsiasi linguaggio di programmazione .NET. Per ulteriori informazioni sull'utilizzo dei linguaggi .NET nelle funzioni, vedere Funzioni CLR definite dall'utente.

Tutte le funzioni definite dall'utente presentano una struttura in due parti, ossia un'intestazione e un corpo. Esse accettano zero o più parametri di input e restituiscono un valore scalare o una tabella.

Nell'intestazione vengono definiti gli elementi seguenti:

  • Nome della funzione con nome schema/proprietario facoltativo

  • Tipo dati e nome dei parametri di input

  • Opzioni applicabili ai parametri di input

  • Tipo di dati del parametro restituito e nome facoltativo

  • Opzioni applicabili al parametro restituito

Nel corpo viene definita l'azione, o logica, che la funzione deve eseguire. In esso è contenuto uno dei seguenti elementi:

  • Una o più istruzioni Transact-SQL che eseguono la logica della funzione

  • Un riferimento a un assembly .NET

Nell'esempio seguente viene mostrata una semplice funzione definita dall'utente Transact-SQL in cui vengono identificati i principali componenti della funzione. La funzione valuta una data fornita e restituisce un valore che indica la posizione della data in una settimana.

IF OBJECT_ID(N'dbo.GetWeekDay', N'FN') IS NOT NULL
    DROP FUNCTION dbo.GetWeekDay;
GO
CREATE FUNCTION dbo.GetWeekDay           -- function name
(@Date datetime)                     -- input parameter name and data type
RETURNS int                          -- return parameter data type
AS
BEGIN                                -- begin body definition
RETURN DATEPART (weekday, @Date)     -- action performed
END;
GO

Nell'esempio seguente viene mostrato l'utilizzo della funzione in un'istruzione Transact-SQL.

SELECT dbo.GetWeekDay(CONVERT(DATETIME,'20020201',101)) AS DayOfWeek;
GO

Set di risultati:

DayOfWeek
---------
6  
(1 row(s) affected)