Funzioni deterministiche e non deterministicheDeterministic and Nondeterministic Functions

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.Deterministic functions always return the same result any time they are called with a specific set of input values and given the same state of the database. 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.Nondeterministic functions may return different results each time they are called with a specific set of input values even if the database state that they access remains the same. Ad esempio, tramite la funzione AVG viene restituito sempre lo stesso risultato in base alle condizioni indicate in precedenza, ma tramite la funzione GETDATE, mediante la quale viene restituito il valore datetime corrente, viene sempre restituito un risultato diverso.For example, the function AVG always returns the same result given the qualifications stated above, but the GETDATE function, which returns the current datetime value, always returns a different result.

Le funzioni definite dall'utente includono diverse proprietà che influiscono sulla capacità del Motore di database di SQL ServerSQL Server Database Engine di indicizzare i risultati della funzione, tramite gli indici nelle colonne calcolate che chiamano la funzione o tramite le viste indicizzate che fanno riferimento alla funzione.There are several properties of user-defined functions that determine the ability of the Motore di database di SQL ServerSQL Server Database Engine to index the results of the function, either through indexes on computed columns that call the function, or through indexed views that reference the function. Una di queste proprietà è la proprietà deterministica di una funzione.The determinism of a function is one such property. Non è, ad esempio, possibile creare un indice cluster in una vista se la vista fa riferimento a funzioni non deterministiche.For example, a clustered index cannot be created on a view if the view references any nondeterministic functions. Per altre informazioni sulle proprietà delle funzioni, inclusa la proprietà deterministica, vedere Funzioni definite dall'utente.For more information about the properties of functions, including determinism, see User-Defined Functions.

In questo argomento vengono illustrati la proprietà deterministica delle funzioni di sistema predefinite e l'effetto sulla proprietà deterministica delle funzioni definite dall'utente quando contiene una chiamata a stored procedure estese.This topic identifies the determinism of built-in system functions and the effect on the deterministic property of user-defined functions when it contains a call to extended stored procedures.

Proprietà deterministica delle funzioni predefiniteBuilt-in Function Determinism

Non è possibile influenzare la proprietà deterministica di alcuna funzione predefinita.You cannot influence the determinism of any built-in function. Ogni funzione predefinita è deterministica o non deterministica in base al modo in cui viene implementata da SQL ServerSQL Server.Each built-in function is deterministic or nondeterministic based on how the function is implemented by SQL ServerSQL Server. Ad esempio, la specifica di una clausola ORDER BY in una query non comporta la modifica del determinismo di una funzione usata nella query in questione.For example, specifying an ORDER BY clause in a query does not change the determinism of a function that is used in that query.

Tutte le funzioni per i valori stringa predefinite sono deterministiche.All of the string built-in functions are deterministic. Per un elenco di queste funzioni, vedere Funzioni per i valori stringa (Transact-SQL).For a list of these functions, see String Functions (Transact-SQL).

Le funzioni riportate di seguito, appartenenti alle categorie di funzioni predefinite diverse da quelle per i valori stringa, sono sempre deterministiche.The following built-in functions from categories of built-in functions other than string functions are always deterministic.

ABSABS DATEDIFFDATEDIFF POWERPOWER
ACOSACOS DAYDAY RADIANSRADIANS
ASINASIN DEGREESDEGREES ROUNDROUND
ATANATAN EXPEXP SIGNSIGN
ATN2ATN2 FLOORFLOOR SINSIN
CEILINGCEILING ISNULLISNULL SQUARESQUARE
COALESCECOALESCE ISNUMERICISNUMERIC SQRTSQRT
COSCOS LOGLOG TANTAN
COTCOT LOG10LOG10 YEARYEAR
DATALENGTHDATALENGTH MONTHMONTH
DATEADDDATEADD NULLIFNULLIF

Le funzioni elencate di seguito non sono sempre deterministiche, ma possono essere utilizzate in viste indicizzate o indici in colonne calcolate quando vengono specificate in modo deterministico.The following functions are not always deterministic, but can be used in indexed views or indexes on computed columns when they are specified in a deterministic manner.

FunzioneFunction CommentiComments
Tutte le funzioni di aggregazioneall aggregate functions Tutte le funzioni di aggregazione sono deterministiche a meno che non vengano specificate con le clausole OVER e ORDER BY.All aggregate functions are deterministic unless they are specified with the OVER and ORDER BY clauses. Per un elenco di queste funzioni, vedere Funzioni di aggregazione (Transact-SQL).For a list of these functions, see Aggregate Functions (Transact-SQL).
CASTCAST Deterministica a meno che non sia usata con datetime, smalldatetimeo sql_variant.Deterministic unless used with datetime, smalldatetime, or sql_variant.
CONVERTCONVERT Deterministica a meno che non si verifichi una delle condizioni seguenti:Deterministic unless one of these conditions exists:



Il tipo di origine è sql_variant.Source type is sql_variant.

Il tipo di destinazione è sql_variant e il relativo tipo di origine è non deterministico.Target type is sql_variant and its source type is nondeterministic.

Il tipo di origine o di destinazione è datetime o smalldatetime, l'altro tipo di origine o di destinazione è una stringa di caratteri ed è specificato uno stile non deterministico.Source or target type is datetime or smalldatetime, the other source or target type is a character string, and a nondeterministic style is specified. Per essere deterministico, il parametro di stile deve essere una costante.To be deterministic, the style parameter must be a constant. Gli stili minori o uguali a 100 sono non deterministici, ad eccezione degli stili 20 e 21.Additionally, styles less than or equal to 100 are nondeterministic, except for styles 20 and 21. Gli stili maggiori di 100 sono deterministici, ad eccezione degli stili 106, 107, 109 e 113.Styles greater than 100 are deterministic, except for styles 106, 107, 109 and 113.
CHECKSUMCHECKSUM Deterministica, ad eccezione di CHECKSUM().Deterministic, with the exception of CHECKSUM().
ISDATEISDATE Deterministica solo se utilizzata con la funzione CONVERT, se è specificato il parametro di stile CONVERT e se lo stile non equivale a 0, 100, 9 o 109.Deterministic only if used with the CONVERT function, the CONVERT style parameter is specified and style is not equal to 0, 100, 9, or 109.
RANDRAND RAND risulta deterministica solo quando si specifica un parametro per il valore di inizializzazione .RAND is deterministic only when a seed parameter is specified.

Tutte le funzioni statistiche di sistema, di configurazione, per i cursori, per i metadati e di sicurezza sono di tipo non deterministico.All the configuration, cursor, metadata, security, and system statistical functions are nondeterministic. Per un elenco di queste funzioni, vedere Funzioni di configurazione (Transact-SQL), Funzioni per i cursori (Transact-SQL), Funzioni per i metadati (Transact-SQL), Funzioni di sicurezza (Transact-SQL) e Funzioni statistiche di sistema (Transact-SQL).For a list of these functions, see Configuration Functions (Transact-SQL), Cursor Functions (Transact-SQL), Metadata Functions (Transact-SQL), Security Functions (Transact-SQL), and System Statistical Functions (Transact-SQL).

Di seguito sono elencate le funzioni predefinite di altre categorie che sono sempre non deterministiche.The following built-in functions from other categories are always nondeterministic.

@@CONNECTIONS@@CONNECTIONS GETDATEGETDATE
@@CPU_BUSY@@CPU_BUSY GETUTCDATEGETUTCDATE
@@DBTS@@DBTS GET_TRANSMISSION_STATUSGET_TRANSMISSION_STATUS
@@IDLE@@IDLE LAGLAG
@@IO_BUSY@@IO_BUSY LAST_VALUELAST_VALUE
@@MAX_CONNECTIONS@@MAX_CONNECTIONS LEADLEAD
@@PACK_RECEIVED@@PACK_RECEIVED MIN_ACTIVE_ROWVERSIONMIN_ACTIVE_ROWVERSION
@@PACK_SENT@@PACK_SENT NEWIDNEWID
@@PACKET_ERRORS@@PACKET_ERRORS NEWSEQUENTIALIDNEWSEQUENTIALID
@@TIMETICKS@@TIMETICKS NEXT VALUE FORNEXT VALUE FOR
@@TOTAL_ERRORS@@TOTAL_ERRORS NTILENTILE
@@TOTAL_READ@@TOTAL_READ PARSENAMEPARSENAME
@@TOTAL_WRITE@@TOTAL_WRITE PERCENTILE_CONTPERCENTILE_CONT
AT TIME ZONEAT TIME ZONE PERCENTILE_DISCPERCENTILE_DISC
CUME_DISTCUME_DIST PERCENT_RANKPERCENT_RANK
CURRENT_TIMESTAMPCURRENT_TIMESTAMP RANDRAND
DENSE_RANKDENSE_RANK RANKRANK
FIRST_VALUEFIRST_VALUE ROW_NUMBERROW_NUMBER
FORMATFORMAT TEXTPTRTEXTPTR

Chiamata di stored procedure estese da funzioniCalling Extended Stored Procedures from Functions

Le funzioni che chiamano stored procedure estese sono non deterministiche, in quanto le stored procedure estese possono avere effetti collaterali sul database,Functions that call extended stored procedures are nondeterministic, because the extended stored procedures can cause side effects on the database. ovvero possono comportare modifiche di uno stato globale del database, quale un aggiornamento di una tabella o di una risorsa esterna, come un file o la rete, tramite, ad esempio, la modifica di un file o l'invio di un messaggio di posta elettronica.Side effects are changes to a global state of the database, such as an update to a table, or to an external resource, such as a file or the network; for example, modifying a file or sending an e-mail message. Quando si esegue una stored procedure estesa da una funzione definita dall'utente, il set di risultati restituito potrebbe non essere coerente.Do not rely on returning a consistent result set when executing an extended stored procedure from a user-defined function. Le funzioni definite dall'utente che creano effetti collaterali sul database non sono consigliate.User-defined functions that create side effects on the database are not recommended.

Quando viene chiamata dall'interno di una funzione, una stored procedure estesa non può restituire set di risultati al client.When called from inside a function, the extended stored procedure cannot return result sets to the client. Qualsiasi API ODS che restituisca set di risultati al client è in possesso di un codice FAIL.Any Open Data Services API that returns result sets to the client, has a return code of FAIL.

La stored procedure estesa può connettersi nuovamente a SQL ServerSQL Server.The extended stored procedure can connect back to SQL ServerSQL Server. Tuttavia, la procedura non può unire in join la stessa transazione della funzione originale che ha richiamato la stored procedure estesa.However, the procedure cannot join the same transaction as the original function that invoked the extended stored procedure.

In modo analogo a una chiamata da un batch o da una stored procedure, la stored procedure estesa viene eseguita nel contesto dell'account di sicurezza di MicrosoftMicrosoft Windows in cui è in esecuzione SQL ServerSQL Server .Similar to invocations from a batch or stored procedure, the extended stored procedure is executed in the context of the MicrosoftMicrosoft Windows security account under which SQL ServerSQL Server is running. Le autorizzazioni di questo contesto di protezione devono essere tenute presenti dal proprietario della stored procedure estesa quando vengono concesse ad altri utenti le autorizzazioni per eseguire la procedura.The owner of the extended stored procedure should consider the permissions of this security context, when granting permissions to other users to execute the procedure.