Funzioni scalari definite dall'utente per OLTP in memoria

Si applica a:SQL Serverdatabase SQL di AzureIstanza gestita di SQL di Azure

SQL Server 2016 (13.x) consente di creare ed eliminare funzioni scalari definite dall'utente e compilate in modo nativo. È anche possibile modificare queste funzioni definite dall'utente. La compilazione nativa migliora le prestazioni di valutazione delle funzioni definite dall'utente in Transact-SQL.

Quando si modifica una funzione scalare definita dall'utente e compilata in modo nativo, l'applicazione resta disponibile durante l'esecuzione dell'operazione e la compilazione della nuova versione della funzione.

Per i costrutti T-SQL supportati, vedere Funzionalità supportate per i moduli T-SQL compilati in modo nativo.

Creazione, eliminazione e modifica delle funzioni definite dall'utente

Usare CREATE FUNCTION per creare la funzione scalare definita dall'utente compilata in modo nativo, DROP FUNCTION per rimuovere la funzione definita dall'utente e ALTER FUNCTION per modificare la funzione. BEGIN ATOMIC WITH è obbligatorio per le funzioni definite dall'utente.

Per informazioni sulla sintassi supportata ed eventuali restrizioni, vedere gli argomenti seguenti.

È possibile usare la stored procedure sp_recompile (Transact-SQL) con la funzione scalare definita dall'utente e compilata in modo nativo. Ne risulterà la funzione ricompilata usando la definizione presente nei metadati.

L'esempio seguente mostra una UDF scalare del database di esempio AdventureWorks2022.

CREATE FUNCTION [dbo].[ufnLeadingZeros_native](@Value int)   
RETURNS varchar(8)   
WITH NATIVE_COMPILATION, SCHEMABINDING  
AS   
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'English')  
  
    DECLARE @ReturnValue varchar(8);  
    SET @ReturnValue = CONVERT(varchar(8), @Value);  
       DECLARE @i int = 0, @count int = 8 - LEN(@ReturnValue)  
  
    WHILE @i < @count  
       BEGIN  
            SET @ReturnValue = '0' + @ReturnValue;  
            SET @i += 1  
       END  
  
    RETURN (@ReturnValue);  
  
END  

Chiamare funzioni definite dall'utente

È possibile usare le funzioni scalari definite dall'utente e compilate in modo nativo nelle espressioni, collocandole nella stessa posizione delle funzioni scalari predefinite e delle funzioni scalari definite dall'utente interpretate. Le funzioni scalari definite dall'utente compilate nativamente possono essere usate anche con l'istruzione EXECUTE, in un'istruzione Transact-SQL e in una stored procedure compilata nativamente.

È possibile usare queste funzioni scalari definite dall'utente nelle stored procedure compilate in modo nativo e nelle funzioni definite dall'utente compilate in modo nativo, nonché ovunque sia consentito l'uso di funzioni predefinite. È possibile usare le funzioni scalare definite dall'utente e compilate in modo nativo nei moduli tradizionali di Transact-SQL.

Le funzioni scalari definite dall'utente funzionano in modalità di interoperabilità, ovunque possa essere usata una funzione scalare definita dall'utente interpretata. Questo utilizzo è soggetto alle limitazioni delle transazioni tra contenitori, come descritto nella sezione Supported Isolation Levels for Cross-Container Transactions (Livelli di isolamento supportati per le transazioni tra contenitori) di Transactions with Memory-Optimized Tables(Transazioni con tabelle con ottimizzazione per la memoria). Per altre informazioni sulla modalità di interoperabilità, vedere Accesso alle tabelle con ottimizzazione per la memoria utilizzando codice Transact-SQL interpretato.

Le funzioni scalari definite dall'utente e compilate in modo nativo necessitano di un contesto di esecuzione esplicito. Per altre informazioni, vedere EXECUTE AS Clausola (Transact-SQL). EXECUTE AS CALLER non è supportato. Per altre informazioni, vedere EXECUTE (Transact-SQL).

Per la sintassi supportata dalle istruzioni Transact-SQL Execute relativa alle funzioni scalari definite dall'utente e compilate in modo nativo, vedi EXECUTE (Transact-SQL). Per la sintassi supportata per l'esecuzione delle funzioni definite dall'utente in una stored procedure compilata in modo nativo, vedere Funzionalità supportate per i moduli T-SQL compilati in modo nativo.

Suggerimenti e parametri

Il supporto per i suggerimenti di tabella, join e query all'interno delle funzioni scalari definite dall'utente compilate in modo nativo è equivalente a quello per questi suggerimenti nelle stored procedure compilate in modo nativo. Come con le funzioni scalari definite dall'utente interpretate, gli hint per le query inclusi in una query Transact-SQL che fanno riferimento a una funzione scalari definite dall'utente e compilata in modo nativo non influiscono sul piano di query per tale funzione definita dall'utente.

I parametri supportati per le funzioni scalari definite dall'utente compilate in modo nativo sono tutti i parametri supportati per le stored procedure compilate in modo nativo, purché tali parametri siano consentiti per le funzioni scalari definite dall'utente. Il parametro con valori di tabella è un esempio di parametro supportato.

Associato a uno schema

Quanto segue si applica alle funzioni scalari definite dall'utente e compilate in modo nativo.

  • Deve essere associato allo schema utilizzando l'argomento WITH SCHEMABINDING in CREATE FUNCTION e ALTER FUNCTION.

  • Non può essere eliminato o modificato quando vi fa riferimento una stored procedure associata a uno schema o una funzione definita dall'utente.

SHOWPLAN_XML

Le funzioni scalari definite dall'utente compilate in modo nativo supportano SHOWPLAN_XML. È conforme allo schema generale SHOWPLAN_XML , come per le stored procedure compilate in modo nativo. L'elemento di base per le funzioni definite dall'utente è <UDF>.

STATISTICS XML non è supportato per le funzioni scalari definite dall'utente compilate in modo nativo. Quando si esegue una query che fa riferimento alla funzione definita dall'utente, con STATISTICS XML abilitato, il contenuto XML viene restituito senza la parte per la funzione definita dall'utente.

Autorizzazioni

Come per le stored procedure compilate in modo nativo, le autorizzazioni per gli oggetti a cui fa riferimento una funzione scalare definita dall'utente compilata in modo nativo vengono controllate al momento della creazione della funzione. CREATE FUNCTION non riesce se l'utente impersonato non dispone delle autorizzazioni necessarie. Se le modifiche alle autorizzazioni dell'utente rappresentato fanno sì che l'utente perda le autorizzazioni corrette, le successive esecuzioni della funzione definita dall'utente avranno esito negativo.

Quando si usa una funzione scalare definita dall'utente e compilata in modo nativo all'interno di una stored procedure compilata in modo nativo, le autorizzazioni per l'esecuzione della funzione definita dall'utente vengono controllate al momento della creazione della routine esterna. Se l'utente di cui la routine esterna assume l'identità non dispone delle autorizzazioni EXECUTE per la funzione definita dall'utente, la creazione della procedura archiviata non riesce. Se le modifiche alle autorizzazioni fanno sì che l'utente perda le autorizzazioni EXEC, l'esecuzione della procedura esterna ha esito negativo.

Vedi anche

Funzioni predefinite (Transact-SQL)
Salvare un piano di esecuzione in formato XML