Condividi tramite


Funzioni deterministiche e non deterministiche

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureEndpoint di analisi SQL in Microsoft FabricWarehouse in Microsoft FabricDatabase SQL in Microsoft Fabric

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 ogni volta che vengono chiamati con un set specifico di valori di input anche se lo stato del database a cui accedono rimane invariato. Ad esempio, la funzione AVG restituisce sempre lo stesso risultato in base alle qualifiche indicate in precedenza, ma la GETDATE funzione, che restituisce il valore datetime corrente, restituisce sempre un risultato diverso.

Le funzioni definite dall'utente includono diverse proprietà che influiscono sulla capacità del motore di database di SQL Server 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. 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, incluso il determinismo, vedere Funzioni definite dall'utente.

Le funzioni deterministiche devono essere associate allo schema. Usare la clausola SCHEMABINDING durante la creazione di una funzione deterministica.

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.

Determinare se una funzione è deterministica

È possibile verificare se una funzione è deterministica eseguendo una query sulla proprietà dell'oggetto is_deterministic per la funzione. Nell'esempio seguente viene determinato se la funzione Sales.CalculateSalesTax è deterministica.

SELECT OBJECTPROPERTY(OBJECT_ID('Sales.CalculateSalesTax'), 'IsDeterministic');

Proprietà deterministica delle funzioni predefinite

Non è possibile influenzare la proprietà deterministica di alcuna funzione predefinita. Ogni funzione predefinita è deterministica o non deterministica, in base alla modalità di implementazione della funzione da parte di SQL Server. Ad esempio, la specifica di una ORDER BY clausola in una query non modifica il determinismo di una funzione usata in tale query.

Tutte le funzioni per i valori stringa predefinite sono deterministiche, ad eccezione di FORMAT. Per un elenco di queste funzioni, vedere Funzioni stringa.

Le funzioni riportate di seguito, appartenenti alle categorie di funzioni predefinite diverse da quelle per i valori stringa, sono sempre deterministiche.

  • ABS
  • ACOS
  • ASIN
  • ATAN
  • ATN2
  • CEILING
  • COALESCE
  • COS
  • COT
  • DATALENGTH
  • DATEADD
  • DATEDIFF
  • DAY
  • DEGREES
  • EXP
  • FLOOR
  • ISNULL
  • ISNUMERIC
  • LOG
  • LOG10
  • MONTH
  • NULLIF
  • POWER
  • RADIANS
  • ROUND
  • SIGN
  • SIN
  • SQRT
  • SQUARE
  • TAN
  • YEAR

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 siano specificate con le OVER clausole e ORDER BY . Per un elenco di queste funzioni, vedere Funzioni di aggregazione.
CAST Deterministica a meno che non sia usata con datetime, smalldatetimeo 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 ed è 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 Deterministico, ad eccezione di CHECKSUM(*).
ISDATE Deterministico solo se usato con la CONVERT funzione, il CONVERT parametro di stile viene specificato e lo stile non è uguale a 0, 100, 9 o 109.
RAND RAND è deterministico solo quando viene specificato un parametro di inizializzazione .

Tutte le funzioni statistiche di sistema, di configurazione, per i cursori, per i metadati e di sicurezza sono di tipo non deterministico. È possibile visualizzare un elenco di queste funzioni.

Di seguito sono elencate le funzioni predefinite di altre categorie che sono sempre non deterministiche.

  • @@CONNECTIONS
  • @@CPU_BUSY
  • @@DBTS
  • @@IDLE
  • @@IO_BUSY
  • @@MAX_CONNECTIONS
  • @@PACKET_ERRORS
  • @@PACK_RECEIVED
  • @@PACK_SENT
  • @@TIMETICKS
  • @@TOTAL_ERRORS
  • @@TOTAL_READ
  • @@TOTAL_WRITE
  • AT TIME ZONE
  • CUME_DIST
  • CURRENT_TIMESTAMP
  • DENSE_RANK
  • FIRST_VALUE
  • FORMAT
  • GETDATE
  • GETUTCDATE
  • GET_TRANSMISSION_STATUS
  • LAG
  • LAST_VALUE
  • LEAD
  • MIN_ACTIVE_ROWVERSION
  • NEWID
  • NEWSEQUENTIALID
  • NEXT VALUE FOR
  • NTILE
  • PARSENAME
  • PERCENTILE_CONT
  • PERCENTILE_DISC
  • PERCENT_RANK
  • RAND
  • 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, Gli effetti collaterali sono modifiche a uno stato globale del database, ad esempio un aggiornamento a una tabella o a una risorsa esterna, ad esempio un file o la rete. Alcuni esempi includono 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 Open Data Services che restituisce set di risultati al client ha un codice restituito di FAIL.

La stored procedure estesa può connettersi nuovamente a 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 un batch o da una stored procedure, la stored procedure estesa viene eseguita nel contesto dell'account di sicurezza di Windows in cui è in esecuzione SQL Server. 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.