Rédiger des instructions Transact-SQL internationales

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

Les directives suivantes facilitent la transition d’une langue à l’autre des bases de données et applications de bases de données qui utilisent des instructions Transact-SQL , ou leur permettent de prendre en charge directement plusieurs langues :

  • À partir de SQL Server 2019 (15.x) et dans Azure SQL Database, utilisez l'un ou l'autre :

    • Les types de données char, varchar et varchar(max) avec un classement activé UTF-8 pour que les données soient encodées en UTF-8.
    • Les types de données nchar, nvarchar et nvarchar(max) avec un classement activé avec caractère supplémentaire pour que les données soient encodées en UTF-16. L’utilisation d’un classement sans caractère supplémentaire génère des données encodées en UCS-2.

    Cela évite les problèmes de conversion de la page de codes. Pour d’autres considérations, consultez Différences de stockage entre UTF-8 et UTF-16.

  • À partir de SQL Server 2017 (14.x), remplacez toutes les utilisations des types de données char, varchar et varchar(max) par nchar, nvarchar, et nvarchar(max). Si vous utilisez un classement activé avec caractère supplémentaire, les données sont encodées au format UTF-16. L’utilisation d’un classement sans caractère supplémentaire génère des données encodées en UCS-2. Cela évite les problèmes de conversion de la page de codes. Pour plus d’informations, voir Classement et prise en charge d’Unicode.

    Important

    Le type de données texte est déconseillé et ne doit pas être utilisé dans les nouveaux travaux de développement. Envisagez de convertir les données texte en données varchar (max).

  • Lors des comparaisons et opérations sur les mois et jours de la semaine, utilisez la partie numérique de la date plutôt que les chaînes de noms. Selon les paramètres de langue, des noms de mois et de jours de la semaine différents sont retournés. Par exemple, DATENAME(MONTH,GETDATE()) retourne May pour l'anglais (États-Unis), Mai pour l'allemand et mai pour le français. Utilisez à la place une fonction comme DATEPART qui utilise le numéro du mois plutôt que son nom. Utilisez les noms DATEPART lorsque vous générez des ensembles de résultats qui seront affichés par un utilisateur, car les noms de date sont souvent plus clairs qu'une représentation numérique. Pour autant, ne codez aucun élément logique dépendant des noms affichés d’une langue spécifique.

  • Pour spécifier des dates dans des comparaisons ou comme entrées d'instructions INSERT ou UPDATE, utilisez des constantes qui sont interprétées de la même manière, quelle que soit la langue définie :

    • Les applications ADO, OLE DB et ODBC doivent utiliser les clauses ODBC d'échappement de temps, de date et d'horodateur :

      { ts' yyyy - mm - dd hh : mm : ss [.fff] '} tel que : { ts'1998-09-24 10:02:20'}

      { d' yyyy - mm - dd '} tel que : { d'1998-09-24'}

      { t' hh : mm : ss '} tel que : { t'10:02:20'}

    • Les applications qui utilisent d’autres API, ou encore des scripts, des procédures stockées ou des déclencheurs Transact-SQL , doivent utiliser les chaînes numériques non séparées. Par exemple, yyyymmdd comme 19980924.

    • Les applications qui utilisent d’autres API, ou encore des scripts Transact-SQL, des procédures stockées ou des déclencheurs, peuvent également utiliser l’instruction CONVERT avec un paramètre de style explicite pour toutes les conversions entre les types de données time, date, smalldate, datetime, datetime2 et datetimeoffset et les types de données de chaînes de caractères. Par exemple, l'instruction suivante est interprétée de la même façon, quels que soient les paramètres de connexion concernant la langue et le format de date :

      SELECT *  
      FROM AdventureWorks2022.Sales.SalesOrderHeader  
      WHERE OrderDate = CONVERT(DATETIME, '20060719', 101)  
      

Voir aussi

CAST et CONVERT (Transact-SQL)
DATEPART (Transact-SQL)
Prise en charge d'Unicode et du classement