Funzioni scalari definite dall'utente per OLTP in memoriaScalar User-Defined Functions for In-Memory OLTP

QUESTO ARGOMENTO SI APPLICA A: sìSQL Server (a partire dalla versione 2016)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

SQL Server 2016SQL Server 2016consente di creare ed eliminare funzioni scalari definite dall'utente e compilate in modo nativo.In SQL Server 2016SQL Server 2016, you can create and drop natively compiled, scalar user-defined functions. Tali funzioni possono anche essere modificate.You can also alter these user-defined functions. La compilazione nativa migliora le prestazioni di valutazione delle funzioni definite dall'utente in Transact-SQL.Native compilation improves performance of the evaluation of user-defined functions 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.When you alter a natively compiled, scalar user-defined function, the application remains available while the operation is being run and the new version of the function is being compiled.

Per i costrutti T-SQL supportati, vedere Funzionalità supportate per i moduli T-SQL compilati in modo nativo.For supported T-SQL constructs, see Supported Features for Natively Compiled T-SQL Modules.

Creazione, eliminazione e modifica delle funzioni definite dall'utenteCreating, Dropping, and Altering User-Defined Functions

Usare CREATE FUNCTION per creare la funzione scalare definita dall'utente e compilata in modo nativo, DROP FUNCTION per eliminarla e ALTER FUNCTION per modificarla.You use the CREATE FUNCTION to create the natively compiled, scalar user-defined function, the DROP FUNCTION to remove the user-defined function, and the ALTER FUNCTION to change the function. BEGIN ATOMIC WITH è obbligatorio per le funzioni definite dall'utente.BEGIN ATOMIC WITH is required for the user-defined functions.

Per informazioni sulla sintassi supportata ed eventuali restrizioni, vedere gli argomenti seguenti.For information about the supported syntax and any restrictions, see the following topics.

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  

Chiamata di funzioni definite dall'utenteCalling User-Defined Functions

È 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.Natively compiled, scalar user-defined functions can be used in expressions, in the same place as built-in scalar functions and interpreted scalar user-defined functions. Possono essere usate con l'istruzione EXECUTE, in un'istruzione Transact-SQL e in una stored procedure compilata in modo nativo,Natively compiled, scalar user-defined functions can also be used with the EXECUTE statement, in a Transact-SQL statement and in a natively compiled stored procedure.

nelle stored procedure compilate in modo nativo e nelle funzioni definite dall'utente e compilate in modo nativo, e ovunque sia consentito l'uso di funzioni predefinite.You can use these scalar user-defined functions in natively compiled store procedures and natively compiled user-defined functions, and wherever built-in functions are permitted. È possibile usare le funzioni scalare definite dall'utente e compilate in modo nativo nei moduli tradizionali di Transact-SQL.You can also use natively compiled, scalar user-defined functions in traditional Transact-SQL modules.

Le funzioni scalari definite dall'utente funzionano in modalità di interoperabilità, ovunque possa essere usata una funzione scalare definita dall'utente interpretata.You can use these scalar user-defined functions in interop mode, wherever an interpreted scalar user-defined function can be used. 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).This use is subject to cross-container transaction limitations, as described in Supported Isolation Levels for Cross-Container Transactions section in Transactions with Memory-Optimized Tables. Per altre informazioni sulla modalità di interoperabilità, vedere Accesso alle tabelle con ottimizzazione per la memoria utilizzando codice Transact-SQL interpretato.For more information about interop mode, see Accessing Memory-Optimized Tables Using Interpreted Transact-SQL.

Le funzioni scalari definite dall'utente e compilate in modo nativo necessitano di un contesto di esecuzione esplicito.Natively compiled, scalar user-defined functions do require an explicit execution context. Per altre informazioni, vedere Clausola EXECUTE AS (Transact-SQL).For more information, see EXECUTE AS Clause (Transact-SQL). EXECUTE AS CALLER non è supportata.EXECUTE AS CALLER is not supported. Per altre informazioni, vedere EXECUTE (Transact-SQL).For more information, see EXECUTE (Transact-SQL).

Per la sintassi supportata dalle istruzioni Transact-SQL Execute relativa alle funzioni scalari definite dall'utente e compilate in modo nativo, vedere EXECUTE (Transact-SQL).For the supported syntax for Transact-SQL Execute statements, for natively compiled, scalar user-defined functions, see 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.For the supported syntax for executing the user-defined functions in a natively compiled stored procedure, see Supported Features for Natively Compiled T-SQL Modules.

Hint e parametriHints and Parameters

Il supporto per tabella, join e hint per la query all'interno delle funzioni scalari definite dall'utente e compilate in modo nativo è uguale al supporto per gli nelle stored procedure compilate in modo nativo.Support for table, join, and query hints inside natively compiled, scalar user-defined functions is equal to support for these hints for natively compiled stored procedures. 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.As with interpreted scalar user-defined functions, the query hints included with a Transact-SQL query that reference a natively compiled, scalar user-defined function do not impact the query plan for this user-defined function.

Queste funzioni supportano tutti i parametri supportati per le stored procedure compilate in modo nativo, a condizione che i parametri siano consentiti dalle funzioni scalari definite dall'utente.The parameters supported for the natively compiled, scalar user-defined functions are all the parameters supported for natively compiled stored procedures, as long as the parameters are allowed for scalar user-defined functions. Il parametro con valori di tabella è un esempio di parametro supportato.An example of a supported parameter is the table-valued parameter.

Associazione a uno schemaSchema-Bound

Quanto segue si applica alle funzioni scalari definite dall'utente e compilate in modo nativo.The following apply to natively compiled, scalar user-defined functions.

  • È necessaria l'associazione a uno schema tramite l'argomento WITH SCHEMABINDING nell'istruzione CREATE FUNCTION e ALTER FUNCTION.Must be schema-bound, by using the WITH SCHEMABINDING argument in the CREATE FUNCTION and ALTER FUNCTION.

  • La funzione che fa riferimento a una stored procedure con associazione a uno schema o definita dall'utente non può essere eliminata o modificata.Cannot be dropped or altered when referenced by a schema-bound stored procedure or user-defined function.

SHOWPLAN_XMLSHOWPLAN_XML

Le funzioni scalari definite dall'utente e compilate in modo nativo supportano SHOWPLAN_XML.Natively compiled, scalar user-defined functions support SHOWPLAN_XML. È conforme allo schema SHOWPLAN_XML generale, come nelle stored procedure compilate in modo nativo.It conforms to the general SHOWPLAN_XML schema, as with natively compiled stored procedures. L'elemento di base per le funzioni definite dall'utente è <UDF>.The base element for the user-defined functions is <UDF>.

Le funzioni scalari definite dall'utente e compilate in modo nativo non supportano STATISTICS XML.STATISTICS XML is not supported for natively compiled, scalar user-defined functions. Quando si esegue una query che fa riferimento alla funzione definita dall'utente, con l'opzione STATISTICS XML abilitata, viene restituito il contenuto XML senza la parte per la stored procedure definita dall'utente.When you run a query referencing the user-defined function, with STATISTICS XML enabled, the XML content is returned without the part for the user-defined function.

AutorizzazioniPermissions

Come per le stored procedure compilate in modo nativo, al momento della creazione della funzione vengono controllate le autorizzazioni per gli oggetti a cui la funzione fa riferimento.As with natively compiled stored procedures, the permissions for objects referenced from a natively compiled, scalar user-defined function are checked when the function is created. L'istruzione CREATE FUNCTION ha esito negativo se l'utente rappresentato non dispone delle autorizzazioni corrette.The CREATE FUNCTION fails if the impersonated user does not have the correct permissions. 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.If permission changes result in the impersonated user no longer having the correct permissions, subsequent executions of the user-defined function fail.

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.When you use a natively compiled, scalar user-defined function inside a natively compiled stored procedure, the permissions for executing the user-defined function are checked when the outer procedure is created. Se l'utente rappresentato dalla ruotine esterna non dispone di autorizzazioni EXEC per la funzione definita dall'utente, la creazione della stored procedure ha esito negativo.If the user impersonated by the outer procedure does not have EXEC permissions for the user-defined function, the creation of the stored procedure fails. Se le modifiche alle autorizzazioni fanno sì che l'utente perda le autorizzazioni EXEC, l'esecuzione della procedura esterna ha esito negativo.If permission changes result in the user no longer having the EXEC permissions, the execution of the outer procedure fails.

Vedere ancheSee Also

Funzioni predefinite (Transact-SQL) Built-in Functions (Transact-SQL)
Salvataggio di un piano di esecuzione in formato XML Save an Execution Plan in XML Format