Partager via


Constructions prises en charge dans les procédures stockées compilées en mode natif

Cette rubrique contient la liste des fonctionnalités prises en charge pour les procédures stockées compilées en mode natif (CREATE PROCEDURE (Transact-SQL)) :

Pour plus d’informations sur les types de données pris en charge dans les procédures stockées compilées en mode natif, consultez Types de données pris en charge.

Pour obtenir des informations complètes sur les constructions non prises en charge et pour plus d’informations sur la façon de contourner certaines des fonctionnalités non prises en charge dans les procédures stockées compilées en mode natif, consultez Problèmes de migration pour les procédures stockées compilées en mode natif. Pour plus d’informations sur les fonctionnalités non prises en charge, consultez Transact-SQL Constructions non prises en charge par In-Memory OLTP.

Programmabilité dans les procédures stockées compilées en mode natif

Les éléments suivants sont pris en charge :

  • BEGIN ATOMIC (au niveau externe de la procédure stockée), LANGUAGE, ISOLATION LEVEL, DATEFORMAT et DATEFIRST.

  • Déclaration de variables comme NULL ou NOT NULL. Si une variable est déclarée comme NOT NULL, la déclaration doit avoir un initialiseur. Si une variable n’est pas déclarée comme NOT NULL, un initialiseur est facultatif.

  • SI et TANT QUE

  • INSÉRER/MISE À JOUR/SUPPRIMER

    Les sous-requêtes ne sont pas prises en charge. Dans la clause WHERE ou HAVING, AND et BETWEEN sont pris en charge ; OR, NOT et IN ne sont pas pris en charge.

  • Types de tables à mémoire optimisée et variables de table.

  • RENDRE

  • Sélectionner

  • RÉGLER

  • TRY/CATCH/THROW

    Pour optimiser les performances, utilisez un seul bloc TRY/CATCH pour une procédure stockée compilée en mode natif.

Opérateurs pris en charge

Les opérateurs suivants sont pris en charge.

  • Les opérateurs de comparaison (Transact-SQL) (par exemple, >, = <>et <=) sont pris en charge dans les conditions (IF, WHILE).

  • Opérateurs unaires (+, -).

  • Opérateurs binaires (*, /, +, -, % (modulo)).

    L’opérateur plus (+) fonctionne sur les nombres et les chaînes.

  • Opérateurs logiques (AND, OR, NOT). OR et NOT sont pris en charge dans les instructions IF et WHILE, mais pas dans les clauses WHERE ou HAVING.

  • Opérateurs au niveau du bit ~, &, | et ^

Fonctions intégrées dans des procédures stockées compilées en mode natif

Les fonctions suivantes sont prises en charge dans les contraintes par défaut sur les tables optimisées en mémoire et dans les procédures stockées compilées en mode natif.

  • Fonctions mathématiques : ACOS, ASIN, ATAN, ATN2, COS, COT, DEGREES, EXP, LOG, LOG10, PI, POWER, RADIANS, RAND, SIN, SQRT, SQUARE et TAN

  • Fonctions de date : CURRENT_TIMESTAMP, DATEADD, DATEDIFF, DATEFROMPARTS, DATEPART, DATETIME2FROMPARTS, DATETIMEFROMPARTS, DAY, EOMONTH, GETDATE, GETUTCDATE, MONTH, SMALLDATETIMEFROMPARTS, SYSUTCDATETIME et YEAR.

  • Fonctions de chaîne : LEN, LTRIM, RTRIM et SUBSTRING

  • Fonction d’identité : SCOPE_IDENTITY

  • Fonctions NULL : ISNULL

  • Fonctions Uniqueidentifier : NEWID et NEWSEQUENTIALID

  • Fonctions d’erreur : ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY et ERROR_STATE

  • Conversions : CAST et CONVERT. Les conversions entre les chaînes de caractères Unicode et non Unicode (n(var)char et (var)char) ne sont pas prises en charge.

  • Fonctions système : @@rowcount. Les instructions à l’intérieur des procédures stockées compilées en mode natif mettent à jour @@rowcount et vous pouvez utiliser @@rowcount dans une procédure stockée compilée en mode natif pour déterminer le nombre de lignes affectées par la dernière instruction exécutée dans cette procédure stockée compilée en mode natif. Toutefois, @@rowcount est réinitialisée à 0 au début et à la fin de l’exécution d’une procédure stockée compilée en mode natif.

Surface de requête dans les procédures stockées compilées nativement

Les éléments suivants sont pris en charge :

  • ENTRE

  • Alias de nom de colonne (en utilisant la syntaxe AS ou =).

  • CROSS JOIN et INNER JOIN, pris en charge uniquement avec les requêtes SELECT.

  • Les expressions sont prises en charge dans la clause SELECT list et WHERE (Transact-SQL) si elles utilisent un opérateur pris en charge. Consultez les opérateurs pris en charge pour obtenir la liste des opérateurs actuellement pris en charge.

  • Prédicat de filtre IS [NOT] NULL

  • Table optimisée en mémoire provenant de <>

  • GROUP BY (Transact-SQL) est pris en charge, ainsi que les fonctions d’agrégation AVG, COUNT, COUNT_BIG, MIN, MAX et SUM. Min et MAX ne sont pas pris en charge pour les types nvarchar, char, varchar, varchar, varbinary et binaire. La clause ORDER BY (Transact-SQL) est prise en charge avec GROUP BY (Transact-SQL) si une expression de la liste ORDER BY apparaît détaillée dans la liste GROUP BY. Par exemple, GROUP BY a + b ORDER BY a + b est supporté, mais GROUP BY a, b ORDER BY a + b ne l’est pas.

  • HAVING, soumis aux mêmes limitations d’expression que la clause WHERE.

  • INSERT VALUES (une ligne par instruction) et INSERT SELECT

  • ORDER BY 1

  • Prédicats ne faisant pas référence à une colonne.

  • SELECT, UPDATE et DELETE

  • TOP 1

  • Affectation de variable dans la liste SELECT.

  • OÙ... ET

1 ORDER BY et TOP sont pris en charge dans les procédures stockées compilées en mode natif, avec certaines restrictions :

  • Il n’existe aucune prise en charge pour DISTINCT dans la clause SELECT ou ORDER BY.

  • Il n’y a pas de prise en charge pour WITH TIES ou PERCENT dans la TOP clause.

  • TOP combiné avec ORDER BY ne prend pas en charge plus de 8 192 lors de l’utilisation d’une constante dans la TOP clause. Cette limite peut être réduite si la requête contient des jointures ou des fonctions d’agrégation. (Par exemple, avec une jointure (deux tables), la limite est de 4 096 lignes. Avec deux jointures (trois tables), la limite est de 2 730 lignes.)

    Vous pouvez obtenir des résultats supérieurs à 8 192 en stockant le nombre de lignes dans une variable :

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

Toutefois, une constante dans la TOP clause entraîne de meilleures performances par rapport à l’utilisation d’une variable.

Ces restrictions ne s’appliquent pas aux accès interprétés Transact-SQL sur les tables optimisées en mémoire.

Processus d'audit

L’audit au niveau des procédures est pris en charge dans les procédures stockées compilées en mode natif. L’audit au niveau de la déclaration n’est pas pris en charge.

Pour plus d’informations sur l’audit, consultez Créer un audit de serveur et une spécification d’audit de base de données.

Indicateurs de table, de requête et de jointure

Les éléments suivants sont pris en charge :

  • Index, FORCESCAN et indicateurs FORCESEEK, soit dans la syntaxe des indicateurs de table, soit dans la clause OPTION (Transact-SQL) de la requête.

  • FORCER L’ORDRE

  • Jointure en boucle interne

  • OPTIMISER POUR

Pour plus d’informations, consultez Indicateurs (Transact-SQL).

Limitations du tri

Vous pouvez trier plus de 8 000 lignes dans une requête qui utilise TOP (Transact-SQL) et une clause ORDER BY (Transact-SQL). Toutefois, sans clause ORDER BY (Transact-SQL),, TOP (Transact-SQL) peut trier jusqu’à 8 000 lignes (moins de lignes s’il existe des jointures).

Si votre requête utilise à la fois l’opérateur TOP (Transact-SQL) et une clause ORDER BY (Transact-SQL), vous pouvez spécifier jusqu’à 8192 lignes pour l’opérateur TOP. Si vous spécifiez plus de 8192 lignes, vous obtenez le message d’erreur : Msg 41398, Level 16, State 1, Procedure ProcedureName<>, Line< LineNumber> L’opérateur TOP peut retourner un maximum de 8192 lignes ; <nombre> a été demandé.

Si vous n’avez pas de clause TOP, vous pouvez trier n’importe quel nombre de lignes avec ORDER BY.

Si vous n’utilisez pas de clause ORDER BY, vous pouvez utiliser n’importe quelle valeur entière avec l’opérateur TOP.

Exemple avec TOP N = 8192 : Compile

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  

Exemple avec TOP N > 8192 : Échec de la compilation.

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  

La limitation de ligne 8192 s’applique uniquement à TOP NN est une constante, comme dans les exemples précédents. Si vous avez besoin de N plus de 8192, vous pouvez affecter la valeur à une variable et utiliser cette variable avec TOP.

Exemple utilisant une variable : Compiles

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  

Limitations relatives aux lignes retournées : Il existe deux cas où cela peut potentiellement réduire le nombre de lignes qui peuvent être retournées par l’opérateur TOP :

  • Utilisation de JOIN dans la requête. L’influence des JOIN sur la limitation dépend du plan de requête.

  • Utilisation de fonctions d’agrégation ou de références à des fonctions d’agrégation dans la clause ORDER BY.

La formule pour calculer N maximum soutenu dans un cas de pire scénario de TOP N est : N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs ).

Voir aussi

Procédures stockées compilées en mode natif
Problèmes de migration pour les procédures stockées compilées en mode natif