Creazione di funzioni definite dall'utente (Motore di database)

Le funzioni definite dall'utente vengono create tramite l'istruzione CREATE FUNCTION, modificate tramite l'istruzione ALTER FUNCTION ed eliminate tramite la funzione DROP FUNCTION. Il nome completo di ogni funzione definita dall'utente (schema_name.function_name) deve essere univoco.

Linee guida

Gli errori Transact-SQL che causano l'annullamento di un'istruzione e l'esecuzione dell'istruzione successiva nel modulo (ad esempio trigger o stored procedure) vengono trattati in modo diverso all'interno di una funzione. Nelle funzioni tali errori interrompono l'esecuzione della funzione, che a sua volta comporta l'interruzione dell'istruzione che ha richiamato la funzione.

Le istruzioni in un blocco BEGIN...END non possono avere effetti collaterali. Gli effetti collaterali di una funzione sono le modifiche permanenti allo stato di una risorsa il cui ambito è al di fuori della funzione, ad esempio la modifica di una tabella di database. Le uniche modifiche che possono essere apportate dalle istruzioni nella funzione sono le modifiche agli oggetti locali rispetto alla funzione, ad esempio variabili o cursori locali. Modifiche a tabelle di database, operazioni su cursori che non sono locali rispetto alla funzione, invio di messaggi di posta elettronica, tentativi di modifica del catalogo e generazione di un set di risultati da restituire all'utente sono esempi di azioni che non possono essere eseguite in una funzione.

Nota

Se un'istruzione CREATE FUNCTION produce effetti collaterali su risorse che non esistono quando l'istruzione CREATE FUNCTION viene eseguita, SQL Server esegue l'istruzione. Tuttavia, SQL Server non esegue la funzione quando viene richiamata.

Il numero di volte in cui viene effettivamente eseguita una funzione specificata in una query varia in base ai piani di esecuzione creati da Query Optimizer. Si consideri ad esempio una funzione richiamata da una subquery in una clausola WHERE. Il numero di volte in cui la subquery e la relativa funzione vengono eseguite varia in base ai diversi percorsi di accesso scelti da Query Optimizer.

Istruzioni valide in una funzione

I tipi di istruzioni valide in una funzione sono i seguenti:

  • Istruzioni DECLARE che definiscono variabili di dati e cursori locali rispetto alla funzione.

  • Assegnazioni di valori a oggetti locali rispetto alla funzione, ad esempio utilizzando SET per assegnare valori a variabili locali scalari e di tabella.

  • Operazioni su cursori che fanno riferimento a cursori locali dichiarati, aperti, chiusi e deallocati nella funzione. Non sono consentite istruzioni FETCH che restituiscono dati al client. Sono consentite solo istruzioni FETCH che assegnano valori a variabili locali mediante la clausola INTO.

  • Istruzioni per il controllo di flusso, ad eccezione delle istruzioni TRY...CATCH.

  • Istruzioni SELECT che includono elenchi di selezione con espressioni che assegnano valori a variabili locali rispetto alla funzione.

  • Istruzioni INSERT, UPDATE e DELETE che modificano le variabili di tabella locali rispetto alla funzione.

  • Istruzioni EXECUTE che chiamano stored procedure estese.

Funzioni di sistema predefinite

Le funzioni predefinite non deterministiche seguenti possono essere utilizzate nelle funzioni Transact-SQL definite dall'utente.

CURRENT_TIMESTAMP

@@MAX_CONNECTIONS

GET_TRANSMISSION_STATUS

@@PACK_RECEIVED

GETDATE

@@PACK_SENT

GETUTCDATE

@@PACKET_ERRORS

@@CONNECTIONS

@@TIMETICKS

@@CPU_BUSY

@@TOTAL_ERRORS

@@DBTS

@@TOTAL_READ

@@IDLE

@@TOTAL_WRITE

@@IO_BUSY

 

Le funzioni predefinite non deterministiche seguenti non possono essere utilizzate nelle funzioni Transact-SQL definite dall'utente.

NEWID

RAND

NEWSEQUENTIALID

TEXTPTR

Per un elenco delle funzioni di sistema predefinite deterministiche e non deterministiche, vedere Funzioni deterministiche e non deterministiche.

Funzioni associate a schema

L'istruzione CREATE FUNCTION supporta la clausola SCHEMABINDING che associa la funzione allo schema degli oggetti a cui fa riferimento, ad esempio tabelle, viste e altre funzioni definite dall'utente. I tentativi di modifica o eliminazione degli oggetti a cui fa riferimento una funzione associata a schema hanno esito negativo.

Per includere la clausola SCHEMABINDING in un'istruzione CREATE FUNCTION devono essere soddisfatte le condizioni seguenti:

  • Tutte le viste e le funzioni definite dall'utente a cui la funzione fa riferimento devono essere associate a uno schema.

  • Tutti gli oggetti a cui fa riferimento la funzione devono essere inclusi nello stesso database in cui si trova la funzione. Per fare riferimento agli oggetti utilizzare nomi in una parte o in due parti.

  • È necessario disporre di autorizzazione REFERENCES per tutti gli oggetti (tabelle, viste e funzioni definite dall'utente) a cui la funzione fa riferimento.

È possibile utilizzare l'istruzione ALTER FUNCTION per eliminare l'associazione allo schema. L'istruzione ALTER FUNCTION deve ridefinire la funzione senza specificare WITH SCHEMABINDING.

Impostazione dei parametri

Le funzioni definite dall'utente accettano zero o più parametri di input e restituiscono tabelle o valori scalari. Una funzione può avere al massimo 1024 parametri di input. Quando a un parametro della funzione è associato un valore predefinito, quando si chiama la funzione è necessario specificare la parola chiave DEFAULT per ottenere il valore predefinito. Questa funzionalità risulta diversa per i parametri con valore predefinito nelle stored procedure definite dall'utente in cui l'omissione del parametro implica l'utilizzo del valore predefinito. Le funzioni definite dall'utente non supportano parametri di output.