Linee guida per la progettazione di funzioni definite dall'utente

Le funzioni definite dall'utente vengono archiviate come oggetti di database che forniscono codice riutilizzabile in diversi modi:

  • Nelle istruzioni Transact-SQL, ad esempio SELECT.

  • Nelle applicazioni che chiamano la funzione.

  • Nella definizione di un'altra funzione definita dall'utente.

  • Per parametrizzare una vista o per migliorare le funzionalità di una vista indicizzata.

  • Per definire una colonna di una tabella.

  • Per definire un vincolo CHECK su una colonna.

  • Per sostituire una stored procedure.

Scelta del tipo di funzione

Quando si progetta una funzione definita dall'utente, è necessario innanzitutto individuare il tipo di funzione che meglio si adatta alle proprie esigenze e in particolare stabilire quale operazione dovrà eseguire:

  • Restituire un valore scalare (valore singolo).

  • Restituire una tabella (più righe).

  • Eseguire un calcolo complesso.

  • Accedere principalmente a dati di SQL Server.

Le funzioni definite dall'utente scritte in Transact-SQL o .NET Framework possono restituire sia valori scalari che valori tabella.

Proprietà delle funzioni

Le funzioni definite dall'utente includono numerose proprietà che influiscono sulla capacità di Motore di database di SQL Server di indicizzare i risultati della funzione, sia tramite gli indici nelle colonne calcolate che chiamano la funzione sia tramite le viste indicizzate che fanno riferimento alla funzione. Tali proprietà sono inoltre applicabili ai metodi dei tipi CLR definiti dall'utente. Per informazioni, vedere CLR User-Defined Types (informazioni in lingua inglese).

Determinismo

Le funzioni deterministiche restituiscono sempre lo stesso risultato quando vengono chiamate con un set di valori di input specifico e se lo stato del database rimane invariato. Le funzioni non deterministiche possono restituire risultati diversi quando vengono chiamate con un set di valori di input specifico, anche se lo stato del database a cui accedono rimane invariato.

Motore di database analizza automaticamente il corpo delle funzioni Transact-SQL e stabilisce se la funzione è deterministica. Ad esempio, se la funzione chiama altre funzioni non deterministiche o stored procedure estese, Motore di database contrassegna la funzione come non deterministica. Per le funzioni CLR (Common Language Runtime), Motore di database si basa sull'autore della funzione per contrassegnare la funzione come deterministica o non deterministica tramite l'attributo personalizzato SqlFunction (informazioni in lingua inglese).

Precisione

Una funzione definita dall'utente è precisa se non prevede operazioni con valori a virgola mobile.

Motore di database analizza automaticamente il corpo delle funzioni Transact-SQL e stabilisce se la funzione è precisa. Per le funzioni CLR, Motore di database si basa sull'autore della funzione per contrassegnare la funzione come precisa o non precisa tramite l'attributo personalizzato SqlFunction (informazioni in lingua inglese).

Accesso ai dati

Questa proprietà indica se la funzione accede al server di database locale utilizzando il provider gestito in-process di SQL Server. Per ulteriori informazioni, vedere Accesso ai dati da oggetti di database CLR.

Motore di database analizza automaticamente il corpo delle funzioni Transact-SQL e stabilisce se la funzione esegue l'accesso ai dati. Per le funzioni CLR, Motore di database si basa sull'autore della funzione per indicare le caratteristiche di accesso ai dati tramite l'attributo personalizzato SqlFunction (informazioni in lingua inglese). Questa proprietà viene applicata in fase di esecuzione da Motore di database. Se la funzione indica DataAccess = None, ma esegue l'accesso ai dati, la funzione ha esito negativo in fase di esecuzione.

Accesso ai dati di sistema

Questa proprietà indica se la funzione accede ai metadati di sistema nel server di database locale utilizzando il provider gestito in-process di SQL Server.

Motore di database analizza automaticamente il corpo delle funzioni Transact-SQL e stabilisce se la funzione esegue l'accesso ai dati di sistema. Per le funzioni CLR, Motore di database si basa sull'autore della funzione per indicare le caratteristiche di accesso ai dati di sistema tramite l'attributo personalizzato SqlFunction (informazioni in lingua inglese). Questa proprietà viene applicata in fase di esecuzione da Motore di database. Se la funzione indica SystemDataAccess = None, ma esegue l'accesso ai dati di sistema, la funzione ha esito negativo in fase di esecuzione.

IsSystemVerified

Questa proprietà indica se le proprietà della funzione relative al determinismo e alla precisione possono essere verificate da Motore di database. Il valore di questa proprietà è true per le funzioni Transact-SQL che non chiamano altre funzioni contrassegnate con IsSystemVerified = false. Per le funzioni CLR, il valore della proprietà è false.

Motore di database deriva automaticamente la proprietà IsSystemVerified per le funzioni. Le funzioni Transact-SQL che accedono a funzioni contrassegnate con IsSystemVerified = false verranno anch'esse contrassegnate con IsSystemVerified = false.

Per ulteriori informazioni sulle funzioni nelle colonne calcolate indicizzate e nelle viste indicizzate, vedere Creazione di indici per le colonne calcolate e Creazione di viste indicizzate.