Funzioni deterministiche e non deterministiche
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. 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.
Esistono diverse proprietà delle funzioni definite dall'utente che determinano la possibilità del motore di database di SQL Server di indicizzare i risultati della funzione, tramite indici su colonne calcolate che chiamano la funzione o tramite viste indicizzate che fanno riferimento alla funzione. Una di queste proprietà è la proprietà deterministica di una funzione. Non è, ad esempio, possibile creare un indice cluster in una vista se la vista fa riferimento a funzioni non deterministiche. Per altre informazioni sulle proprietà delle funzioni, inclusa la proprietà deterministica, vedere Funzioni definite dall'utente.
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.
Proprietà deterministica delle funzioni predefinite
Non è possibile influenzare la proprietà deterministica di alcuna funzione predefinita. Ogni funzione predefinita è deterministica o non deterministica in base al modo in cui la funzione viene implementata da SQL Server. Ad esempio, la specifica di una clausola ORDER BY in una query non comporta la modifica del determinismo di una funzione utilizzata nella query in questione.
Tutte le funzioni per i valori stringa predefinite sono deterministiche. Per un elenco di queste funzioni, vedere Funzioni stringa (Transact-SQL).
Le funzioni riportate di seguito, appartenenti alle categorie di funzioni predefinite diverse da quelle per i valori stringa, sono sempre deterministiche.
ABS | DATEDIFF | POWER |
ACOS | DAY | RADIANS |
ASIN | DEGREES | ROUND |
ATAN | EXP | SIGN |
ATN2 | FLOOR | SIN |
CEILING | ISNULL | SQUARE |
COALESCE | ISNUMERIC | SQRT |
COS | LOG | TAN |
COT | LOG10 | YEAR |
DATALENGTH | MONTH | |
DATEADD | NULLIF |
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.
Funzione | Commenti |
---|---|
Tutte le funzioni di aggregazione | Tutte le funzioni di aggregazione sono deterministiche a meno che non vengano specificate con le clausole OVER e ORDER BY. Per un elenco di queste funzioni, vedere Funzioni di aggregazione (Transact-SQL). |
CAST | Deterministica a meno che non venga utilizzata con datetime , smalldatetime o sql_variant . |
CONVERT | Deterministica a meno che non si verifichi una delle condizioni seguenti: Il tipo di origine è sql_variant .Il tipo di destinazione è sql_variant e il relativo tipo di origine è non deterministico.Il tipo di origine o di destinazione è datetime o smalldatetime , l'altro tipo di origine o di destinazione è una stringa di caratteri. Inoltre è specificato uno stile non deterministico. Per essere deterministico, il parametro di stile deve essere una costante. Gli stili minori o uguali a 100 sono non deterministici, ad eccezione degli stili 20 e 21. Gli stili maggiori di 100 sono deterministici, ad eccezione degli stili 106, 107, 109 e 113. |
CHECKSUM | Deterministica, ad eccezione di CHECKSUM(*). |
ISDATE | 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. |
RAND | RAND risulta deterministica solo quando si specifica un parametro per il valore di inizializzazione . |
Tutte le funzioni statistiche di sistema, di configurazione, per i cursori, per i metadati e di sicurezza sono di tipo non deterministico. Per un elenco di queste funzioni, vedere Funzioni di configurazione (Transact-SQL), Funzionicursori (Transact-SQL), Funzioni di metadati (Transact-SQL), Funzioni di sicurezza ( Transact-SQL) e Funzioni statistiche del sistema (Transact-SQL) .
Di seguito sono elencate le funzioni predefinite di altre categorie che sono sempre non deterministiche.
@@CONNECTIONS | GETDATE |
@@CPU_BUSY | GETUTCDATE |
@@DBTS | GET_TRANSMISSION_STATUS |
@@IDLE | LAG |
@@IO_BUSY | LAST_VALUE |
@@MAX_CONNECTIONS | LEAD |
@@PACK_RECEIVED | MIN_ACTIVE_ROWVERSION |
@@PACK_SENT | NEWID |
@@PACKET_ERRORS | NEWSEQUENTIALID |
@@TIMETICKS | NEXT VALUE FOR |
@@TOTAL_ERRORS | NTILE |
@@TOTAL_READ | PARSENAME |
@@TOTAL_WRITE | PERCENTILE_CONT |
CUME_DIST | PERCENTILE_DISC |
CURRENT_TIMESTAMP | PERCENT_RANK |
DENSE_RANK | RAND |
FIRST_VALUE | RANK |
ROW_NUMBER | |
TEXTPTR |
Chiamata di stored procedure estese da funzioni
Le funzioni che chiamano stored procedure estese sono non deterministiche, in quanto le stored procedure estese possono avere effetti collaterali sul 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. Quando si esegue una stored procedure estesa da una funzione definita dall'utente, il set di risultati restituito potrebbe non essere coerente. Le funzioni definite dall'utente che creano effetti collaterali sul database non sono consigliate.
Quando viene chiamata dall'interno di una funzione, una stored procedure estesa non può restituire set di risultati al client. Qualsiasi API ODS che restituisca set di risultati al client restituirà il codice FAIL.
La stored procedure estesa può connettersi nuovamente all'SQL Server. Tuttavia, la procedura non può unire in join la stessa transazione della funzione originale che ha richiamato la stored procedure estesa.
Analogamente alle chiamate da una stored procedure batch o stored procedure, la stored procedure estesa viene eseguita nel contesto dell'account di sicurezza di Microsoft Windows in cui è in esecuzione SQL Server. Questo aspetto deve essere tenuto presente dal proprietario della stored procedure estesa quando vengono concesse ad altri utenti le autorizzazioni per eseguire la procedura.