Funzioni (Motore di database)
In SQL Server sono disponibili funzioni predefinite per l'esecuzione di operazioni specifiche.
Le funzioni possono essere utilizzate o incluse all'interno degli elementi seguenti:
L'elenco di selezione di una query che esegue un'istruzione SELECT per ottenere un valore.
SELECT DB_NAME(); GO
Una condizione di ricerca della clausola WHERE di un'istruzione SELECT o per la modifica dei dati, ad esempio SELECT, INSERT, DELETE o UPDATE, per limitare le righe da includere nella query.
USE AdventureWorks2008R2; GO SELECT SalesOrderID, ProductID, OrderQty FROM Sales.SalesOrderDetail WHERE OrderQty = (SELECT MAX(OrderQty) FROM Sales.SalesOrderDetail); GO
La condizione di ricerca, ovvero la clausola WHERE, di una vista per adattare dinamicamente la vista all'utente o all'ambiente in fase di esecuzione.
CREATE VIEW ShowMyEmploymentInfo AS SELECT FirstName, LastName FROM Person.Person WHERE BusinessEntityID = SUSER_SID(); GO
In qualsiasi espressione.
Un vincolo CHECK o un trigger per la ricerca di valori specificati quando si immettono dati.
CREATE TABLE SalesContacts (SalesRepID INT PRIMARY KEY CHECK (SalesRepID = SUSER_SID() ), ContactName VARCHAR(50) NULL, ContactPhone VARCHAR(13) NULL); GO
Un vincolo DEFAULT o un trigger per fornire un valore se non è stato specificato da un'istruzione INSERT.
CREATE TABLE SalesContacts ( SalesRepID INT PRIMARY KEY CHECK (SalesRepID = SUSER_SID() ), ContactName VARCHAR(50) NULL, ContactPhone VARCHAR(13) NULL, WhenCreated DATETIME DEFAULT GETDATE(), Creator INT DEFAULT SUSER_SID() ); GO
Le funzioni vengono specificate tra parentesi, anche in assenza di parametri. Fanno eccezione le funzioni senza parametri utilizzate con la parola chiave DEFAULT. Le funzioni senza parametri non accettano parametri. Per ulteriori informazioni sulla parola chiave DEFAULT, vedere ALTER TABLE (Transact-SQL) e CREATE TABLE (Transact-SQL).
In alcuni casi i parametri che specificano un database, un computer, un account di accesso o un utente di database sono facoltativi. Se vengono omessi, per impostazione predefinita viene fatto riferimento al database, al computer host, all'account di accesso o all'utente del database corrente.
Le funzioni possono essere nidificate.
Categorie delle funzioni
Nella tabella seguente vengono descritte le categorie delle funzioni di SQL Server.
Categoria delle funzioni |
Descrizione |
---|---|
Consentono di eseguire operazioni che uniscono più valori in un unico valore. Alcuni esempi sono COUNT, SUM, MIN e MAX. |
|
Rappresentano funzioni scalari che restituiscono informazioni sulle impostazioni di configurazione. |
|
Supportano crittografia, decrittografia, firma digitale e convalida delle firme digitali. |
|
Restituiscono informazioni sullo stato di un cursore. |
|
Consentono di modificare i valori di data e ora. |
|
Consentono di eseguire operazioni trigonometriche, geometriche e altre operazioni numeriche. |
|
Restituiscono informazioni sugli attributi di database e oggetti di database. |
|
Funzioni non deterministiche che restituiscono un valore di rango per ogni riga di una partizione. |
|
Restituiscono set di righe che è possibile utilizzare in un'istruzione Transact-SQL al posto di un riferimento di tabella. |
|
Restituiscono informazioni sugli utenti e sui ruoli. |
|
Consentono di modificare i valori char, varchar, nchar, nvarchar, binary e varbinary. |
|
Consentono di eseguire operazioni o visualizzare informazioni su opzioni e oggetti di sistema. |
|
Restituiscono informazioni sulle prestazioni di SQL Server. |
|
Consentono di modificare i valori text e image. |
Funzioni deterministiche e non deterministiche
In SQL Server le funzioni sono classificate come rigorosamente deterministiche, deterministiche o non deterministiche.
Una funzione è rigorosamente deterministica se per un set specifico di valori di input restituisce sempre lo stesso risultato.
Per le funzioni definite dall'utente viene applicata una nozione di determinismo meno rigida. Una funzione definita dall'utente è deterministica se, per un set di valori di input e uno stato del database specifici, restituisce sempre lo stesso risultato. Se la funzione non è rigorosamente deterministica, può essere deterministica in questo senso se esegue l'accesso ai dati.
Una funzione non deterministica, se chiamata ripetutamente con lo stesso set di valori di input, può restituire risultati diversi. Ad esempio, la funzione GETDATE() è non deterministica. In SQL Server vengono imposte restrizioni su varie classi di non determinismo. Le funzioni non deterministiche, pertanto, vanno utilizzate con cautela.
Per le funzioni predefinite, determinismo e determinismo rigoroso si equivalgono. Per le funzioni Transact-SQL definite dall'utente, il sistema verifica la definizione e impedisce la definizione di funzioni non deterministiche. Una funzione che esegue l'accesso ai dati o non associata a schema, tuttavia, viene considerata non rigorosamente deterministica. Per le funzioni CLR (Common Language Runtime), le definizioni delle funzioni specificano le proprietà deterministiche, di accesso ai dati e di accesso ai dati di sistema della funzione, ma poiché queste proprietà non sono verificate dal sistema, le funzioni sono sempre considerate non rigorosamente deterministiche.
La mancanza di determinismo di una funzione può limitarne le possibilità di utilizzo. In viste e colonne calcolate indicizzate, colonne calcolate persistenti o definizioni di funzioni Transact-SQL definite dall'utente è possibile richiamare solo funzioni deterministiche.
La mancanza di determinismo rigoroso di una funzione può impedire ottimizzazioni delle prestazioni di notevole importanza. Alcuni passaggi di riordino dei piani vengono cautelativamente ignorati, per preservare la correttezza. Il numero, l'ordine e l'occorrenza nel tempo delle chiamate alle funzioni definite dall'utente, inoltre, dipendono dall'implementazione. Non è consigliabile basarsi su questa semantica delle chiamate. Ad eccezione delle costanti di run-time per le funzioni predefinite non deterministiche RAND e GETDATE, il numero, l'ordine e l'occorrenza nel tempo delle chiamate dipendono dal piano scelto.
Procedure consigliate
Si consiglia di attenersi sempre alle seguenti linee guida:
1. Quando è possibile, scrivere funzioni rigorosamente deterministiche. In particolare, rendere le funzioni Transact-SQL associate a schema.
2. Limitare l'utilizzo delle funzioni non deterministiche agli elenchi di selezione più esterni.
3. Non utilizzare funzioni non deterministiche in query critiche per le prestazioni.
4. Non basarsi sul numero, l'ordine o l'occorrenza nel tempo delle chiamate, poiché possono dipendere dall'implementazione.
Per ulteriori informazioni, vedere Funzioni deterministiche e non deterministiche.
Vedere anche