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)):
Programmabilità nelle stored procedure compilate in modo nativo
Funzioni predefinite nelle stored procedure compilate in modo nativo
Superficie di attacco per le query nelle stored procedure compilate in modo nativo
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 clausolaSELECT
oORDER BY
.WITH TIES
oPERCENT
non è supportata nella clausolaTOP
.TOP
in combinazione conORDER BY
non supporta un valore superiore a 8.192 quando si utilizza una costante nella clausolaTOP
. 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 N
N
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