Funzioni deterministiche e non deterministiche

Data aggiornamento: 17 luglio 2006

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.

Le funzioni definite dall'utente includono numerose proprietà che influiscono sulla capacità del Motore di database di SQL Server di indicizzare i risultati della funzione, sia tramite gli indici nelle colonne calcolate che chiamano la funzione sia 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 ulteriori informazioni sulle proprietà delle funzioni, inclusa la proprietà deterministica, vedere Linee guida per la progettazione di funzioni definite dall'utente.

In questo argomento vengono illustrate la proprietà deterministica delle funzioni di sistema predefinite e l'influenza sulla proprietà deterministica delle funzioni definite dall'utente quando la proprietà 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 è o non è deterministica in base alla sua modalità di implementazione da parte di Microsoft SQL Server 2005.

Tutte le funzioni per i valori stringa e di aggregazione predefinite sono deterministiche. Per un elenco di queste funzioni, vedere Funzioni di aggregazione (Transact-SQL) and Funzioni per i valori stringa (Transact-SQL).

Di seguito sono elencate alcune categorie di funzioni predefinite, non per i valori stringa o di aggregazione, che sono sempre deterministiche.

ABS

DATEDIFF

PARSENAME

ACOS

DAY

POWER

ASIN

DEGREES

RADIANS

ATAN

EXP

ROUND

ATN2

FLOOR

SIGN

CEILING

ISNULL

SIN

COALESCE

ISNUMERIC

SQUARE

COS

LOG

SQRT

COT

LOG10

TAN

DATALENGTH

MONTH

YEAR

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

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. Inoltre, gli stili minori o uguali a 100 sono non deterministici, a eccezione degli stili 20 e 21. Gli stili maggiori di 100 sono deterministici, a eccezione degli stili 106, 107, 109 e 113.

CHECKSUM

Deterministica, ad eccezione di CHECKSUM(*).

ISDATE

Deterministica solo se utilizzata con la funzione CONVERT, se il parametro di stile è specificato e se lo stile non equivale a 0, 100, 9 o 109.

RAND

RAND è deterministica solo quando è specificato un parametro seed.

Tutte le funzioni statistiche di sistema, di configurazione, per i cursori, per i metadati e di protezione sono di tipo non deterministico. 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 protezione (Transact-SQL) e Funzioni statistiche di sistema (Transact-SQL).

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

@@CONNECTIONS

@@TOTAL_READ

@@CPU_BUSY

@@TOTAL_WRITE

@@DBTS

CURRENT_TIMESTAMP

@@IDLE

GETDATE

@@IO_BUSY

GETUTCDATE

@@MAX_CONNECTIONS

GET_TRANSMISSION_STATUS

@@PACK_RECEIVED

MIN_ACTIVE_ROWVERSION

@@PACK_SENT

NEWID

@@PACKET_ERRORS

NEWSEQUENTIALID

@@TIMETICKS

RAND

@@TOTAL_ERRORS

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 consistente. 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 a SQL Server. Tuttavia, la procedura non può unire in join la stessa transazione della funzione originale che ha richiamato la stored procedure estesa.

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 protezione di Microsoft Windows in cui è in esecuzione SQL Server. Questo deve essere tenuto in considerazione dal proprietario della stored procedure estesa quando vengono concesse ad altri utenti le autorizzazioni per eseguire la procedura.

Vedere anche

Concetti

Linee guida per la progettazione di funzioni definite dall'utente
Funzioni definite dall'utente valutate a livello di tabella
Funzioni inline definite dall'utente
Riformulazione di stored procedure come funzioni

Altre risorse

Progettazione di funzioni definite dall'utente

Guida in linea e informazioni

Assistenza su SQL Server 2005

Cronologia modifiche

Versione Cronologia
Contenuto modificato:
  • Aggiunta di informazioni alla descrizione della funzione CONVERT per specificare che l'utilizzo di CONVERT genera risultati deterministici a meno che il tipo di origine o di destinazione sia datetime o smalldatetime, l'altro tipo di origine o di destinazione sia una stringa di caratteri e venga specificato uno stile non deterministico.
  • È stato inoltre chiarito quali stili sono deterministici e quali non deterministici.