Condividi tramite


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

Funzioni di aggregazione (Transact-SQL)

Consentono di eseguire operazioni che uniscono più valori in un unico valore. Alcuni esempi sono COUNT, SUM, MIN e MAX.

Funzioni di configurazione

Rappresentano funzioni scalari che restituiscono informazioni sulle impostazioni di configurazione.

Funzioni di crittografia (Transact-SQL)

Supportano crittografia, decrittografia, firma digitale e convalida delle firme digitali.

Funzioni per i cursori

Restituiscono informazioni sullo stato di un cursore.

Funzioni di data e ora

Consentono di modificare i valori di data e ora.

Funzioni matematiche

Consentono di eseguire operazioni trigonometriche, geometriche e altre operazioni numeriche.

Funzioni per i metadati

Restituiscono informazioni sugli attributi di database e oggetti di database.

Funzioni di rango

Funzioni non deterministiche che restituiscono un valore di rango per ogni riga di una partizione.

Funzioni per i set di righe (Transact-SQL)

Restituiscono set di righe che è possibile utilizzare in un'istruzione Transact-SQL al posto di un riferimento di tabella.

Funzioni di sicurezza

Restituiscono informazioni sugli utenti e sui ruoli.

Funzioni per i valori stringa

Consentono di modificare i valori char, varchar, nchar, nvarchar, binary e varbinary.

Funzioni di sistema

Consentono di eseguire operazioni o visualizzare informazioni su opzioni e oggetti di sistema.

Funzioni statistiche di sistema (Transact-SQL)

Restituiscono informazioni sulle prestazioni di SQL Server.

Funzioni per i valori text e image

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.