Fonctionnalités prises en charge pour les modules T-SQL compilés en mode natif

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Cette rubrique présente la surface d’exposition T-SQL et dresse la liste des fonctionnalités prises en charge dans le corps des modules T-SQL compilés en mode natif, notamment les procédures stockées (CREATE PROCEDURE Transact-SQL)), les fonctions scalaires définies par l’utilisateur, les fonctions table incluses inline et les déclencheurs.

Pour connaître les fonctionnalités prises en charge autour de la définition des modules natifs, consultez DDL pris en charge pour les modules T-SQL compilés en mode natif.

Pour plus d’informations sur les constructions qui ne sont pas prises en charge et sur la manière de contourner certaines des fonctionnalités non prises en charge dans les modules compilés en mode natif, consultez Migration Issues for Natively Compiled Stored Procedures. Pour plus d’informations sur les fonctionnalités non prises en charge, consultez Les constructions Transact-SQL ne sont pas prises en charge par l’OLTP en mémoire.

Surface d’exposition de requête dans les modules natifs

Les constructions de requête suivantes sont prises en charge :

Expression CASE : CASE peut être utilisé dans n’importe quelle instruction ou clause qui autorise une expression valide.

  • S'applique à: SQL Server 2017 (14.x).
    À compter de SQL Server 2017 (14.x), les instructions CASE sont désormais prises en charge pour les modules T-SQL compilés en mode natif.

Clause SELECT :

  • Alias de colonnes et de noms (en utilisant la syntaxe AS ou =).

  • Sous-requêtes scalaires

    • S'applique à: SQL Server 2016 (13.x). À compter de SQL Server 2016 (13.x), les sous-requêtes scalaires sont désormais prises en charge dans les modules compilés en mode natif.
  • TOP*

  • SELECT DISTINCT

    • S'applique à: SQL Server 2016 (13.x). À compter de SQL Server 2016 (13.x), l’opérateur DISTINCT est pris en charge dans les modules compilés en mode natif.

      • Les fonctions d’agrégation DISTINCT ne sont pas prises en charge.
  • UNION et UNION ALL

    • S'applique à: SQL Server 2016 (13.x). À compter de SQL Server 2016 (13.x), les opérateurs UNION et UNION ALL sont désormais pris en charge dans les modules compilés en mode natif.
  • Affectations variables

Clause FROM :

  • Variable de table ou de table optimisée en mémoire FROM <>

  • FROM <compilé en mode natif TVF inline>

  • LEFT OUTER JOIN, RIGHT OUTER JOIN, CROSS JOIN et INNER JOIN.

    • S'applique à: SQL Server 2016 (13.x). À compter de SQL Server 2016 (13.x), JOINS est désormais pris en charge dans les modules compilés en mode natif.
  • Sous-requêtes [AS] table_alias. Pour plus d’informations, consultez FROM (Transact-SQL).

    • S'applique à: SQL Server 2016 (13.x). À compter de SQL Server 2016 (13.x), les sous-requêtes sont désormais prises en charge dans les modules compilés en mode natif.

Clause WHERE :

  • Prédicat de filtre IS [NOT] NULL

  • AND, BETWEEN

  • OR, NOT, IN, EXISTS

    • S'applique à: SQL Server 2016 (13.x). À compter de SQL Server 2016 (13.x), les opérateurs OR/NOT/IN/EXISTS sont désormais pris en charge dans les modules compilés en mode natif.

ClauseGROUP BY :

  • 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 binary.

ClauseORDER BY :

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

  • Est pris en charge avec GROUP BY (Transact-SQL) si une expression dans 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 pris en charge, mais GROUP BY a, b ORDER BY a + b n'est pas pris en charge.

Clause HAVING :

  • Est assujetti aux mêmes limitations d’expression que la clause WHERE.

ORDER BY et TOP sont pris en charge dans les modules compilés en mode natif, avec quelques restrictions.

  • Il n'existe aucune prise en charge de WITH TIES ou PERCENT dans la clause TOP .

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

  • La clauseTOP associée à ORDER BY ne prend pas en charge plus de 8 192 lignes lorsqu'une constante est utilisée dans la clause TOP .

    • Cette limite peut être abaissée lorsque la requête contient des jointures ou des fonctions d'agrégation. Par exemple, avec une jointure (entre deux tables), la limite est de 4 096 lignes. Avec deux jointures (entre trois tables), la limite est de 2 730 lignes.
    • Vous pouvez obtenir plus de 8 192 résultats en stockant le nombre de lignes dans une variable :
DECLARE @v INT = 9000;
SELECT TOP (@v) ... FROM ... ORDER BY ...

Cependant, l'utilisation d'une constante dans la clause TOP donne de meilleurs résultats qu'une variable.

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

Modification de données

Les instructions DML suivantes sont prises en charge.

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

  • UPDATE

  • Suppression

  • La clause WHERE est prise en charge avec les instructions UPDATE et DELETE.

Langage de contrôle de flux

Les constructions de langage de contrôle de flux suivantes sont prises en charge.

Opérateurs pris en charge

Les opérateurs suivants sont pris en charge :

  • Opérateurs de comparaison (Transact-SQL) (par exemple, >, , <>=et <=)

  • Opérateurs unaires (+, -).

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

    • L'opérateur plus (+) est pris en charge pour les nombres et les chaînes.
  • Opérateurs logiques (AND, OR, NOT).

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

  • APPLY (opérateur)

    • S'applique à: SQL Server 2017 (14.x).
      À compter de SQL Server 2017 (14.x), l’opérateur APPLY est pris en charge dans les modules compilés en mode natif.

Fonctions intégrées dans les modules compilés en mode natif

Les fonctions suivantes sont prises en charge dans les contraintes sur les tables optimisées en mémoire et dans les modules T-SQL compilés en mode natif.

  • Toutes les fonctions mathématiques (Transact-SQL)

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

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

    • S'applique à: SQL Server 2017 (14.x).
      À compter de SQL Server 2017 (14.x), les fonctions intégrées suivantes sont également prises en charge : TRIM, TRANSLATE et CONCAT_WS.
  • Fonction d’identité : SCOPE_IDENTITY

  • Fonctions NULL : ISNULL

  • Fonctions Uniqueidentifier : NEWID et NEWSEQUENTIALID

  • Fonctions JSON

    • S'applique à: SQL Server 2017 (14.x).
      À compter de SQL Server 2017 (14.x), les fonctions JSON sont prises en charge dans les modules compilés en mode natif.
  • Fonctions d’erreur : ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY et ERROR_STATE

  • Fonctions système : @@rowcount. Les instructions dans les 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. Cependant, @@rowcount est réinitialisé à 0 au début et à la fin de l'exécution d'une procédure stockée compilée en mode natif.

  • Fonctions de sécurité : IS_MEMBER({'group' | 'role'}), IS_ROLEMEMBER ('role' [, 'database_principal’]), IS_SRVROLEMEMBER ('role' [, 'login’]), ORIGINAL_LOGIN(), SESSION_USER, CURRENT_USER, SUSER_ID(['login’]), SUSER_SID(['login’] [, Param2]), SUSER_SNAME([server_user_sid]), SYSTEM_USER, SUSER_NAME, USER, USER_ID(['user']), USER_NAME([id]), CONTEXT_INFO().

  • Les exécutions de modules natifs peuvent être imbriquées.

Audit

L'audit au niveau de la procédure est pris en charge dans les procédures stockées compilées en mode natif.

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

Indicateurs de requête et de table

Les constructions suivantes sont admises :

Pour plus d’informations, consultez Indicateurs de requête (Transact-SQL).

Limitations sur le 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 en cas de jointure).

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, triez les lignes avec ORDER BY.

Si vous n'utilisez pas de clause ORDER BY, utilisez une valeur entière avec l'opérateur TOP.

Exemple avec TOP N = 8192 : Compiles

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 8192 lignes s'applique uniquement à TOP NN est une constante, comme dans les exemples précédents. Si N doit être supérieur à 8192, vous pouvez affecter la valeur à une variable et utiliser cette variable avec TOP.

Exemple à l'aide d'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 sur les lignes retournées : il existe deux cas de figure qui peuvent potentiellement réduire le nombre de lignes retournées par l'opérateur TOP :

  • L'utilisation de JOINs dans la requête. L'impact de JOINs sur une limitation dépend du plan de requête.

  • L'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 la valeur maximale N prise en charge dans le pire des cas dans TOP 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