Condividi tramite


Costrutti supportati in stored procedure compilate in modo nativo

Questo argomento contiene un elenco di funzionalità supportate per stored procedure compilate in modo nativo (CREATE PROCEDURE (Transact-SQL)):

Per informazioni sui tipi di dati supportati nelle stored procedure compilate in modo nativo, vedere Supported Data Types.

Per informazioni complete sui costrutti non supportati e per informazioni su come sopperire ad alcune funzionalità non supportate nelle stored procedure compilate in modo nativo, vedere Migration Issues for Natively Compiled Stored Procedures. Per altre informazioni su funzionalità non supportate, vedere Costrutti Transact-SQL non supportati da OLTP in memoria.

Programmabilità nelle stored procedure compilate in modo nativo

Sono supportati gli elementi seguenti:

  • BEGIN ATOMIC (al livello esterno della stored procedure), LANGUAGE, ISOLATION LEVEL, DATEFORMAT e DATEFIRST.

  • Dichiarazione di variabili come NULL o NOT NULL. Se una variabile viene dichiarata come NOT NULL, la dichiarazione deve avere un inizializzatore. Se la variabile non viene dichiarata come NOT NULL, un inizializzatore è facoltativo.

  • IF e WHILE.

  • INSERT/UPDATE/DELETE

    Le sottoquery non sono supportate. Nella clausola WHERE o HAVING, AND e BETWEEN sono supportati; OR, NOT IN e IN non sono supportati.

  • Tipi di tabella con ottimizzazione per la memoria e variabili di tabella.

  • RETURN

  • SELECT

  • SET

  • TRY/CATCH/THROW

    Per ottimizzare le prestazioni, utilizzare un solo blocco TRY/CATCH per un'intera stored procedure compilata in modo nativo.

Operatori supportati

Di seguito vengono elencati gli operatori supportati.

  • Gli operatori di confronto (Transact-SQL) (ad esempio , >, = <>e <=) sono supportati in condizionali (IF, WHILE).

  • Operatori unari (+, -).

  • Operatori binari (*, /, +, -, % (modulo)).

    L'operatore di addizione (+) è supportato sia con i numeri che con le stringhe.

  • Operatori logici (AND, OR, NOT). OR e NOT sono supportati nelle istruzioni IF e WHILE ma non nelle clausole WHERE o HAVING.

  • Operatori bit per bit ~, &, | e ^

Funzioni predefinite nelle stored procedure compilate in modo nativo

Le seguenti funzioni sono supportate nei vincoli predefiniti nelle tabelle ottimizzate per la memoria e nelle stored procedure compilate in modo nativo.

  • Funzioni matematiche: ACOS, ASIN, ATAN, ATN2, COS, COT, DEGREES, EXP, LOG, LOG10, PI, POWER, RADIANS, RAND, SIN, SQRT, SQUARE e TAN

  • Funzioni di data: CURRENT_TIMESTAMP, DATEADD, DATEDIFF, DATEFROMPARTS, DATEPART, DATETIME2FROMPARTS, DATETIMEFROMPARTS, DAY, EOMONTH, GETDATE, GETUTCDATE, MONTH, SMALLDATETIMEFROMPARTS, SYSDATETIME, SYSUTCDATETIME e YEAR.

  • Funzioni di tipo stringa: LEN, LTRIM, RTRIM e SUBSTRING

  • Funzione di identità: SCOPE_IDENTITY

  • Funzioni NULL: ISNULL

  • Funzioni di identificazione univoca: NEWID e NEWSEQUENTIALID

  • Funzioni di errore: ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY e ERROR_STATE

  • Conversioni: CAST e CONVERT. Le conversioni tra stringhe di caratteri Unicode e non Unicode (n(var)char e (var)char) non sono supportate.

  • Funzioni di sistema: @@rowcount. Tramite le istruzioni all'interno di stored procedure compilate in modo nativo viene aggiornato @@rowcount, che può essere utilizzato in una stored procedure compilata in modo nativo per determinare il numero di righe interessate dall'ultima istruzione eseguita all'interno di questa stored procedure compilata in modo nativo. Tuttavia, @@rowcount viene reimpostato su 0 all'inizio e alla fine dell'esecuzione di una stored procedure compilata in modo nativo.

Superficie di attacco per le query nelle stored procedure compilate in modo nativo

Sono supportati gli elementi seguenti:

  • BETWEEN

  • Alias di nomi di colonna (utilizzando la sintassi AS o =).

  • CROSS JOIN e INNER JOIN, supportati solo con query SELECT.

  • Le espressioni sono supportate nell'elenco SELECT e nella clausola WHERE (Transact-SQL) se usano un operatore supportato. Vedere Operatori supportati per l'elenco degli operatori attualmente supportati.

  • Predicato del filtro IS [NOT] NULL

  • Tabella ottimizzata per la memoria FROM <>

  • GROUP BY (Transact-SQL) è supportato insieme alle funzioni di aggregazione AVG, COUNT, COUNT_BIG, MIN, MAX e SUM. MIN e MAX non sono supportate per i tipi nvarchar, char, varchar, varchar, varbinary e binary. La clausola ORDER BY (Transact-SQL) è supportata con GROUP BY (Transact-SQL) se un'espressione nell'elenco ORDER BY viene visualizzata in modo dettagliato nell'elenco GROUP BY. Ad esempio, l'espressione GROUP BY a + b ORDER BY a + b è supportata, ma GROUP BY a, b ORDER BY a + b non lo è.

  • HAVING, soggetto alle stesse limitazioni delle espressioni della clausola WHERE.

  • INSERT VALUES (una riga per istruzione) e INSERT SELECT

  • ORDER BY 1

  • Predicati che non fanno riferimento a una colonna

  • SELECT, UPDATE e DELETE

  • TOP 1

  • Assegnazione di variabile nell'elenco SELECT.

  • DOVE... E

1 ORDER BY e TOP sono supportati nelle stored procedure compilate in modo nativo, con alcune restrizioni:

  • DISTINCT non è supportata nella clausola SELECT o ORDER BY.

  • WITH TIES o PERCENT non è supportata nella clausola TOP.

  • TOP in combinazione con ORDER BY non supporta un valore superiore a 8.192 quando si utilizza una costante nella clausola TOP. Questo limite può risultare più basso nel caso in cui la query contenga funzioni di aggregazione o dei join. Ad esempio, con un join (due tabelle) il limite scende a 4.096 righe. Con due join (tre tabelle) il limite è 2.730 righe.

    È possibile che si ottengano risultati maggiori di 8.192 archiviando il numero di righe in una variabile:

    DECLARE @v INT = 9000  
    SELECT TOP (@v) ... FROM ... ORDER BY ...  
    

Tuttavia, una costante nella clausola TOP assicura prestazioni migliori rispetto a una variabile.

Queste restrizioni non si applicano all'accesso Transact-SQL interpretato nelle tabelle ottimizzate per la memoria.

Controllo

Il controllo a livello di routine è supportato nelle stored procedure compilate in modo nativo. Il controllo a livello di istruzione non è supportato.

Per ulteriori informazioni sul controllo, vedere Creazione di un controllo del server e di una specifica del controllo del database.

Hint per tabella, query e join

Sono supportati gli elementi seguenti:

  • HINT INDEX, FORCESCAN e FORCEEEK, nella sintassi degli hint di tabella o nella clausola OPTION (Transact-SQL) della query.

  • FORCE ORDER

  • INNER LOOP JOIN

  • OPTIMIZE FOR

Per altre informazioni, vedere Hint (Transact-SQL).

Limitazioni relative all'ordinamento

È possibile ordinare più di 8.000 righe in una query che usa TOP (Transact-SQL) e una clausola ORDER BY (Transact-SQL). Tuttavia, senza clausola ORDER BY (Transact-SQL), TOP (Transact-SQL) può ordinare fino a 8.000 righe ( meno righe se sono presenti join).

Se la query usa sia l'operatore TOP (Transact-SQL) che una clausola ORDER BY (Transact-SQL), è possibile specificare fino a 8192 righe per l'operatore TOP. Se si specificano più di 8192 righe viene visualizzato il messaggio di errore: Msg 41398, Livello 16, Stato 1, ProcedureName<>, LineNumber<> L'operatore TOP può restituire un massimo di 8192 righe; <è stato richiesto il numero>.

Se non si dispone di una clausola TOP, è possibile ordinare qualsiasi numero di righe con ORDER BY.

Se non si utilizza una clausola ORDER BY, è possibile utilizzare qualsiasi valore intero con l'operatore TOP.

Esempio con TOP N = 8192: esegue la compilazione

CREATE PROCEDURE testTop  
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION  
  AS  
  BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')  
    SELECT TOP 8192 ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart  
    ORDER BY ShoppingCartId DESC  
  END;  
GO  

Esempio con TOP N > 8192: errore di compilazione.

CREATE PROCEDURE testTop  
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION  
  AS  
  BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')  
    SELECT TOP 8193 ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart  
    ORDER BY ShoppingCartId DESC  
  END;  
GO  

Il limite di 8192 righe si applica solo a TOP NN dove è una costante, come negli esempi precedenti. Se è necessario un valore N maggiore di 8192 è possibile assegnare il valore a una variabile e utilizzare tale variabile con TOP.

Esempio d'uso di una variabile: esegue la compilazione

CREATE PROCEDURE testTop  
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION  
  AS  
  BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')  
    DECLARE @v int = 8193   
    SELECT TOP (@v) ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart  
    ORDER BY ShoppingCartId DESC  
  END;  
GO  

Limitazioni per le righe restituite: In due casi è possibile che il numero di righe restituibili dall'operatore TOP venga ridotto:

  • Utilizzando JOIN nella query. L'influenza di JOIN sulla limitazione dipende dal piano di query.

  • Utilizzando funzioni di aggregazione o riferimenti a funzioni di aggregazione nella clausola ORDER BY.

La formula per calcolare un valore N massimo supportato nel caso peggiore in TOP N è: N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs ).

Vedere anche

Stored procedure compilate in modo nativo
Problemi di migrazione relativi alle stored procedure compilate in modo nativo