Funzioni definite dall'utenteUser-Defined Functions

In modo analogo alle funzioni dei linguaggi di programmazione, le funzioni definite dall'utente di SQL ServerSQL Server sono routine che accettano parametri, eseguono un'azione (ad esempio un calcolo complesso) e restituiscono il risultato dell'azione sotto forma di valore.Like functions in programming languages, SQL ServerSQL Server user-defined functions are routines that accept parameters, perform an action, such as a complex calculation, and return the result of that action as a value. Il valore restituito può essere un valore scalare singolo o un set di risultati.The return value can either be a single scalar value or a result set.

Funzioni definite dall'utente User-defined functions

Perché usarle?Why use them?

  • Consentono la programmazione modulare.They allow modular programming.

    È possibile creare la funzione una sola volta, archiviarla nel database e richiamarla nel programma tutte le volte che si desidera.You can create the function once, store it in the database, and call it any number of times in your program. Le funzioni definite dall'utente possono essere modificate in maniera indipendente dal codice sorgente del programma.User-defined functions can be modified independently of the program source code.

  • Consentono tempi di esecuzione più rapidi.They allow faster execution.

    In maniera simile alle stored procedure, le funzioni definite dall'utente in Transact-SQLTransact-SQL riducono le risorse necessarie per la compilazione di codice Transact-SQLTransact-SQL memorizzando nella cache e riutilizzando i piani per esecuzioni ripetute.Similar to stored procedures, Transact-SQLTransact-SQL user-defined functions reduce the compilation cost of Transact-SQLTransact-SQL code by caching the plans and reusing them for repeated executions. 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.This means the user-defined function does not need to be reparsed and reoptimized with each use resulting in much faster execution times.

    Le funzioni CLR offrono un significativo vantaggio nelle prestazioni rispetto alle funzioni Transact-SQLTransact-SQL per le attività di calcolo, modifica delle stringhe e logiche di business.CLR functions offer significant performance advantage over Transact-SQLTransact-SQL functions for computational tasks, string manipulation, and business logic. Le funzioni Transact-SQLTransact-SQL sono più adatte per logica intensiva di accesso ai dati. Transact-SQLTransact-SQL functions are better suited for data-access intensive logic.

  • Consentono di ridurre il traffico di rete.They can reduce network traffic.

    È 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.An operation that filters data based on some complex constraint that cannot be expressed in a single scalar expression can be expressed as a function. È quindi possibile richiamare la funzione nella clausola WHERE per ridurre il numero delle righe inviate al client.The function can then invoked in the WHERE clause to reduce the number or rows sent to the client.

Nota

Le funzioni Transact-SQLTransact-SQL definite dall'utente nelle query possono essere eseguite solo su un solo thread (piano di esecuzione seriale). Transact-SQLTransact-SQL user-defined functions in queries can only be executed on a single thread (serial execution plan).

Tipi di funzioni Types of functions

Funzioni scalariScalar Function
Le funzioni scalari definite dall'utente restituiscono un singolo valore di dati del tipo definito nella clausola RETURNS.User-defined scalar functions return a single data value of the type defined in the RETURNS clause. Per una funzione scalare inline, non è disponibile alcun corpo della funzione. Il valore scalare corrisponde al risultato di una singola istruzione.For an inline scalar function, there is no function body; the scalar value is the result of a single statement. Per una funzione scalare con istruzioni multiple, il corpo della funzione, definito in un blocco BEGIN...END, include una serie di istruzioni Transact-SQLTransact-SQL che restituiscono un solo valore.For a multistatement scalar function, the function body, defined in a BEGIN...END block, contains a series of Transact-SQLTransact-SQL statements that return the single value. Il tipo restituito può essere qualsiasi tipo di dati ad eccezione di text, ntext, image, cursore timestamp.The return type can be any data type except text, ntext, image, cursor, and timestamp. Esempi.Examples.

Funzioni con valori di tabellaTable-Valued Functions
Le funzioni con valori di tabella definite dall'utente restituiscono un tipo di dati table.User-defined table-valued functions return a table data type. Per una funzione inline con valori di tabella non è disponibile alcun corpo della funzione. La tabella corrisponde al set di risultati di una singola istruzione SELECT.For an inline table-valued function, there is no function body; the table is the result set of a single SELECT statement. Esempi.Examples.

Funzioni di sistemaSystem Functions
In SQL ServerSQL Server sono disponibili molte funzioni di sistema che è possibile utilizzare per eseguire diverse operazioni. SQL ServerSQL Server provides many system functions that you can use to perform a variety of operations. Tali funzioni non possono essere modificate.They cannot be modified. Per altre informazioni, vedere Funzioni predefinite (Transact-SQL), Funzioni archiviate di sistema (Transact-SQL), and Funzioni e viste a gestione dinamica (Transact-SQL).For more information, see Built-in Functions (Transact-SQL), System Stored Functions (Transact-SQL), and Dynamic Management Views and Functions (Transact-SQL).

Linee guida Guidelines

Gli errori Transact-SQLTransact-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. Transact-SQLTransact-SQL errors that cause a statement to be canceled and continue with the next statement in the module (such as triggers or stored procedures) are treated differently inside a function. Nelle funzioni tali errori arrestano l'esecuzione della funzione,In functions, such errors cause the execution of the function to stop. che a sua volta comporta l'interruzione dell'istruzione che ha richiamato la funzione.This in turn causes the statement that invoked the function to be canceled.

Le istruzioni in un blocco BEGIN...END non possono avere effetti collaterali.The statements in a BEGIN...END block cannot have any side effects. 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.Function side effects are any permanent changes to the state of a resource that has a scope outside the function such as a modification to a database table. 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.The only changes that can be made by the statements in the function are changes to objects local to the function, such as local cursors or variables. 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.Modifications to database tables, operations on cursors that are not local to the function, sending e-mail, attempting a catalog modification, and generating a result set that is returned to the user are examples of actions that cannot be performed in a function.

Nota

Se un'istruzione CREATE FUNCTION produce effetti collaterali su risorse che non esistono quando l'istruzione CREATE FUNCTION viene eseguita, SQL ServerSQL Server esegue l'istruzione.If a CREATE FUNCTION statement produces side effects against resources that do not exist when the CREATE FUNCTION statement is issued, SQL ServerSQL Server executes the statement. Tuttavia, SQL ServerSQL Server non esegue la funzione quando viene richiamata.However, SQL ServerSQL Server does not execute the function when it is invoked.

Il numero di volte in cui viene effettivamente eseguita una funzione specificata in una query varia in base ai piani di esecuzione compilati da Query Optimizer.The number of times that a function specified in a query is actually executed can vary between execution plans built by the optimizer. Si consideri ad esempio una funzione richiamata da una sottoquery in una clausola WHERE.An example is a function invoked by a subquery in a WHERE clause. Il numero di volte in cui la sottoquery e la relativa funzione vengono eseguite varia in base ai diversi percorsi di accesso scelti da Query Optimizer.The number of times the subquery and its function is executed can vary with different access paths chosen by the optimizer.

Istruzioni valide in una funzione Valid statements in a function

I tipi di istruzioni valide in una funzione sono i seguenti:The types of statements that are valid in a function include:

  • Istruzioni DECLARE che definiscono variabili di dati e cursori locali rispetto alla funzione.DECLARE statements can be used to define data variables and cursors that are local to the function.

  • Assegnazioni di valori a oggetti locali rispetto alla funzione, ad esempio utilizzando SET per assegnare valori a variabili locali scalari e di tabella.Assignments of values to objects local to the function, such as using SET to assign values to scalar and table local variables.

  • Operazioni su cursori che fanno riferimento a cursori locali dichiarati, aperti, chiusi e deallocati nella funzione.Cursor operations that reference local cursors that are declared, opened, closed, and deallocated in the function. Non sono consentite istruzioni FETCH che restituiscono dati al client.FETCH statements that return data to the client are not allowed. Sono consentite solo istruzioni FETCH che assegnano valori a variabili locali mediante la clausola INTO.Only FETCH statements that assign values to local variables using the INTO clause are allowed.

  • Istruzioni per il controllo di flusso, ad eccezione delle istruzioni TRY...CATCH.Control-of-flow statements except TRY...CATCH statements.

  • Istruzioni SELECT che includono elenchi di selezione con espressioni che assegnano valori a variabili locali rispetto alla funzione.SELECT statements containing select lists with expressions that assign values to variables that are local to the function.

  • Istruzioni INSERT, UPDATE e DELETE che modificano le variabili di tabella locali rispetto alla funzione.UPDATE, INSERT, and DELETE statements modifying table variables that are local to the function.

  • Istruzioni EXECUTE che chiamano stored procedure estese.EXECUTE statements calling an extended stored procedure.

Funzioni di sistema predefiniteBuilt-in system functions

Le funzioni predefinite non deterministiche seguenti possono essere utilizzate nelle funzioni Transact-SQL definite dall'utente.The following nondeterministic built-in functions can be used in Transact-SQL user-defined functions.

CURRENT_TIMESTAMPCURRENT_TIMESTAMP @@MAX_CONNECTIONS</span><span class="sxs-lookup">@@MAX_CONNECTIONS</span></span>
GET_TRANSMISSION_STATUSGET_TRANSMISSION_STATUS @@PACK_RECEIVED</span><span class="sxs-lookup">@@PACK_RECEIVED</span></span>
GETDATEGETDATE @@PACK_SENT</span><span class="sxs-lookup">@@PACK_SENT</span></span>
GETUTCDATEGETUTCDATE @@PACKET_ERRORS</span><span class="sxs-lookup">@@PACKET_ERRORS</span></span>
@@CONNECTIONS</span><span class="sxs-lookup">@@CONNECTIONS</span></span> @@TIMETICKS</span><span class="sxs-lookup">@@TIMETICKS</span></span>
@@CPU_BUSY</span><span class="sxs-lookup">@@CPU_BUSY</span></span> @@TOTAL_ERRORS</span><span class="sxs-lookup">@@TOTAL_ERRORS</span></span>
@@DBTS</span><span class="sxs-lookup">@@DBTS</span></span> @@TOTAL_READ</span><span class="sxs-lookup">@@TOTAL_READ</span></span>
@@IDLE</span><span class="sxs-lookup">@@IDLE</span></span> @@TOTAL_WRITE</span><span class="sxs-lookup">@@TOTAL_WRITE</span></span>
@@IO_BUSY</span><span class="sxs-lookup">@@IO_BUSY</span></span>

Le funzioni predefinite non deterministiche seguenti non possono essere usate in funzioni Transact-SQL definite dall'utente.The following nondeterministic built-in functions cannot be used in Transact-SQL user-defined functions.

NEWIDNEWID RANDRAND
NEWSEQUENTIALIDNEWSEQUENTIALID TEXTPTRTEXTPTR

Per un elenco delle funzioni di sistema predefinite deterministiche e non deterministiche, vedere Funzioni deterministiche e non deterministiche.For a list of deterministic and nondeterministic built-in system functions, see Deterministic and Nondeterministic Functions.

Funzioni associate a schema Schema-bound functions

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.CREATE FUNCTION supports a SCHEMABINDING clause that binds the function to the schema of any objects it references, such as tables, views, and other user-defined functions. I tentativi di modifica o eliminazione degli oggetti a cui fa riferimento una funzione associata a schema hanno esito negativo.An attempt to alter or drop any object referenced by a schema-bound function fails.

Per includere la clausola SCHEMABINDING in un'istruzione CREATE FUNCTION devono essere soddisfatte le condizioni seguenti:These conditions must be met before you can specify SCHEMABINDING in CREATE FUNCTION:

  • Tutte le viste e le funzioni definite dall'utente a cui la funzione fa riferimento devono essere associate a uno schema.All views and user-defined functions referenced by the function must be schema-bound.

  • Tutti gli oggetti a cui fa riferimento la funzione devono essere inclusi nello stesso database in cui si trova la funzione.All objects referenced by the function must be in the same database as the function. Per fare riferimento agli oggetti utilizzare nomi in una parte o in due parti.The objects must be referenced using either one-part or two-part names.

  • È necessario disporre di autorizzazione REFERENCES per tutti gli oggetti (tabelle, viste e funzioni definite dall'utente) a cui la funzione fa riferimento.You must have REFERENCES permission on all objects (tables, views, and user-defined functions) referenced in the function.

    È possibile utilizzare l'istruzione ALTER FUNCTION per eliminare l'associazione allo schema.You can use ALTER FUNCTION to remove the schema binding. L'istruzione ALTER FUNCTION deve ridefinire la funzione senza specificare WITH SCHEMABINDING.The ALTER FUNCTION statement should redefine the function without specifying WITH SCHEMABINDING.

Specifica dei parametri Specifying parameters

Le funzioni definite dall'utente accettano zero o più parametri di input e restituiscono tabelle o valori scalari.A user-defined function takes zero or more input parameters and returns either a scalar value or a table. Una funzione può avere al massimo 1024 parametri di input.A function can have a maximum of 1024 input parameters. 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.When a parameter of the function has a default value, the keyword DEFAULT must be specified when calling the function to get the default value. 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.This behavior is different from parameters with default values in user-defined stored procedures in which omitting the parameter also implies the default value. Le funzioni definite dall'utente non supportano parametri di output.User-defined functions do not support output parameters.

Altri esempi More examples!

Descrizione dell'attivitàTask Description ArgomentoTopic
Viene descritto come creare una funzione Transact-SQL definita dall'utente.Describes how to create a Transact-SQL user-defined function. Creare funzioni definite dall'utente (motore di database)Create User-defined Functions (Database Engine)
Viene descritto come creare una funzione CLR.Describes how create a CLR function. Creare funzioni CLRCreate CLR Functions
Viene descritto come creare una funzione di aggregazione definita dall'utente.Describes how to create a user-defined aggregate function Creare funzioni di aggregazione definite dall'utenteCreate User-defined Aggregates
Viene descritto come modificare una funzione Transact-SQL definita dall'utente.Describes how to modify a Transact-SQL user-defined function. Modificare funzioni definite dall'utenteModify User-defined Functions
Viene descritto come eliminare una funzione definita dall'utente.Describes how to delete a user-defined function. Eliminare funzioni definite dall'utenteDelete User-defined Functions
Viene descritto come eseguire una funzione definita dall'utente.Describes how to execute a user-defined function. Eseguire funzioni definite dall'utenteExecute User-defined Functions
Viene descritto come rinominare una funzione definita dall'utente.Describes how to rename a user-defined function Rinominare funzioni definite dall'utenteRename User-defined Functions
Viene descritto come visualizzare la definizione di una funzione definita dall'utente.Describes how to view the definition of a user-defined function. Visualizzare funzioni definite dall'utenteView User-defined Functions