Copie de données entre différents classements

Dans Microsoft SQL Server, les données peuvent être déplacées de façon transparente entre des colonnes Unicode et une conversion n'est pas nécessaire. Les données déplacées entre les colonnes contenant des données de caractères non Unicode, cependant, doivent être converties de la page de codes source vers la page de codes cible. Une page de codes est un ensemble ordonné de caractères d'un script donné dans lequel un index numérique, ou valeur de point de code, est associé à chaque caractère. Les pages de codes prennent en charge les ensembles de caractères et les dispositions du clavier utilisés par différents paramètres régionaux Microsoft Windows. Pour obtenir la liste des pages de codes prises en charge, consultez Architecture des pages de codes.

Par défaut, les données de caractères sont converties de la manière suivante :

Opération

Données de caractères converties en :

Exporter

Caractères de page de code OEM

Importer

Caractères de pages de code ANSI/Microsoft Windows.

La conversion entre les pages de code OEM et ANSI entraîne la perte des caractères étendus ou de jeu de caractères codés sur deux octets (DBCS). Pour éviter de telles conversions dans SQL Server, vous pouvez spécifier une page de codes ou un classement.

[!REMARQUE]

Pour plus d'informations sur le transfert d'une base de données d'un classement à un autre, visitez ce site Web de Microsoft.

Dans SQL Server 7.0 et les versions ultérieures, les classements contrôlent le stockage physique des chaînes de caractères. La définition des classements est prise en charge à quatre niveaux : instance de serveur, base de données, colonne de table et expression. Un classement spécifie trois propriétés :

  • La page de codes utilisée pour stocker les données de caractères non Unicode.

  • L'ordre de tri à utiliser pour les types de données Unicode (nchar, nvarchar et ntext). L'ordre de tri définit l'ordre dans lequel les caractères sont triés, et la manière avec laquelle les caractères sont évalués dans les opérations de comparaison.

  • L'ordre de tri à utiliser pour les types de données de caractères non Unicode (char, varchar et text).

[!REMARQUE]

Microsoft vous recommande de spécifier un nom de classement pour chaque colonne dans un fichier de format.

Pour une présentation des pages de code et des classements, consultez Prise en charge d'Unicode et du classement. Pour plus d'informations, consultez Utilisation des classements.

Utilisation d'un classement au niveau des colonnes

Dans SQL Server version 7.0 et ultérieure, vous pouvez contrôler la conversion des données en spécifiant le classement dans lequel les données sont stockées dans le champ du fichier de données cible, pour une exportation en bloc, ou dans la colonne de la table cible, pour une opération d'importation en bloc. Toutes les conversions nécessaires entre le classement du fichier de données et les classements des colonnes de la table dans la base de données sont effectuées en interne par l'opération d'importation et d'exportation.

[!REMARQUE]

Pour SQL Server version 7.0 ou ultérieure, la spécification d'une page de codes est prise en charge, mais il est préférable de spécifier le classement dans un fichier de format.

Les classements s'appliquent toujours aux colonnes SQLCHAR dans les opérations d'importation en bloc et d'exportation en bloc. Les spécifications de classement de colonne sont toujours ignorées pour les colonnes pour lesquelles SQLCHAR ou SQLNCHAR n'est pas spécifié comme leur type de données hôte. Les classements sont utilisés pour déterminer l'ordre de tri des colonnes SQLCHAR et SQLNCHAR pendant des opérations d'importation en bloc pour lesquelles les colonnes sont référencées dans l'indicateur ORDER.

Pour spécifier le classement, vous devez utiliser un fichier de format. Les deux types de fichier de format prennent en charge la spécification des classements au niveau des colonnes. Pour plus d'informations sur l'utilisation des classements dans des fichiers de format non XML, consultez la section suivante, Spécification de classements au niveau des colonnes dans des fichiers de format non XML. Pour plus d'informations sur l'utilisation des classements dans des fichiers de format XML, consultez Description des fichiers de format XML.

Spécification de classements au niveau des colonnes dans des fichiers de format non XML

La colonne finale dans un fichier de format non XML (la colonne est en huitième position) contient une spécification de classement qui définit comment les données pour cette colonne sont stockées dans le fichier de données. Les options de colonne de classement sont les suivantes :

Option

Description

name

Spécifie le nom du classement utilisé pour stocker les données dans le fichier. Pour obtenir une liste des noms de classements SQL, consultez Nom du classement SQL Server (Transact-SQL).

RAW

Spécifie que les données sont stockées dans la page de codes spécifiée dans une option de page de codes dans la commande ou l'indicateur BCPFILECP de bcp_control. Si aucun de ces derniers n'est spécifié, le classement du fichier de données correspond à celui de la page de codes OEM de l'ordinateur client.

RemarqueRemarque
Pour plus d'informations sur les options de page de codes, consultez le paragraphe Utilisation d'une page de codes, ci-après dans cette rubrique. Pour plus d'informations sur l'indicateur BCPFILECP, consultez bcp_control.

""

Possède une signification identique à RAW.

Exemples

L'exemple suivant affiche un fichier de format non-XML avec les classements de colonne spécifiés pour les champs 2 et 3. Les informations de classement sont affichées en gras.

9.0
4
1       SQLCHAR       0       7       "\t"     1     DepartmentID     ""
2       SQLCHAR       0       100     "\t"     2     Name             SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       100     "\t"     3     GroupName        SQL_Latin1_General_CP1_CI_AS
4       SQLCHAR       0       24      "\r\n"   4     ModifiedDate     ""

[!REMARQUE]

Le fichier de format précédent concerne la table HumanResources.Department dans l'exemple de base de données AdventureWorks, qui comporte quatre colonnes : DepartmentID, Name, GroupName et ModifiedDate. Pour plus d'informations sur la table, consultez Table Department (AdventureWorks).

Pour plus d'informations sur les fichiers de format non XML, consultez Description des fichiers de format non XML.

Utilisation d'une page de codes

[!REMARQUE]

Pour contrôler la conversion des données, Microsoft vous recommande d'utiliser un fichier de format pour spécifier les classements au niveau des colonnes pour une opération d'importation en bloc ou d'exportation en bloc. Pour plus d'informations, consultez Utilisation d'un classement au niveau des colonnes, à la section précédente.

La syntaxe pour la spécification d'une page de codes est la suivante :

  • Pour spécifier une page de codes dans une commande bcp, utilisez le commutateur -C :

    -C { ACP | OEM | RAW | code_page }

  • Pour spécifier une page de codes dans une instruction BULK INSERT ou INSERT ... SELECT * FROM OPENROWSET(BULK...), utilisez l'option CODEPAGE.

    CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' }

Le commutateur -C et l'option CODEPAGE acceptent les valeurs suivantes pour la page de codes.

Valeur de la page de codes

Description

ACP

Pendant une opération d'importation, spécifie que les champs de données de type char, varchar ou text sont convertis de la page de codes ANSI/Windows (ISO 1252) vers la page de codes SQL Server.

Pendant une opération d'exportation, spécifie que bcp convertit ces colonnes de la page de codes SQL Server vers la page de codes ANSI/Windows.

OEM (valeur par défaut)

Pendant une opération d'importation, spécifie que les champs de données de type char, varchar ou text sont convertis de la page de codes OEM vers la page de codes SQL Server.

Pendant une opération d'exportation, spécifie que bcp convertit ces colonnes de la page de codes SQL Server vers la page de codes OEM.

RAW

Aucune conversion d'une page de codes vers une autre n'a lieu. Ceci correspond à l'option la plus rapide.

code_page

Un numéro de page de codes spécifique (par exemple 850). Pour obtenir la liste des pages de codes prises en charge, consultez Architecture des pages de codes.

Exemples

Les exemples suivants utilisent la table HumanResources.myTeam dans la base de données AdventureWorks. Avant de pouvoir exécuter ces exemples, vous devez créer cette table. Pour plus d'informations sur la table et la manière de la créer, consultez Création de la table HumanResources.myTeam.

[!REMARQUE]

Avant de tester l'exemple suivant, vous devez supprimer les lignes existantes de la table myTeam pour éviter les conflits de clé primaire.

A. Utilisation d'une page de codes avec bcp

Cet exemple utilise la commande bcp pour l'exportation en bloc de données à partir de la table HumanResources.myTeam dans la base de données AdventureWorks vers le fichier de données myTeam850.txt, utilisant la page de codes 850. À l'invite de commandes Windows, entrez :

bcp AdventureWorks.HumanResources.myTeam out myTeam850.txt -c -C850 -T

B. Utilisation d'une page de codes avec BULK INSERT

Cet exemple utilise BULK INSERT pour l'importation en bloc de myTeam850.txt, créée dans l'exemple bcp précédent, dans la table HumanResources.myTeam de la base de données AdventureWorks.

À partir d'un outil de requête tel que l'Editeur de requête SQL Server Management Studio, exécutez :

USE AdventureWorks
GO
DELETE HumanResources.myTeam
GO
BULK INSERT HumanResources.myTeam 
   FROM 'C:\myTeam850.txt'
   WITH (CODEPAGE = 850);
GO

Exportation en bloc de données entre différents classements

Lors d'une opération d'exportation en bloc, la spécification de classement gère la page de codes utilisée pour stocker les données de caractères dans le fichier de données. Elle s'applique à :

  • toutes les colonnes dans un fichier de données au format caractères ;

  • toute colonne de fichier en mode natif où SQLCHAR est spécifié en tant que type de données de fichier hôte ;

  • tous les caractères SQLCHAR dont les valeurs sont supérieures à 127 ou inférieures à 32.

    Les classements sont appliqués aux caractères dont les valeurs sont comprises entre 32 et 127, mais toutes les pages de codes mappent les mêmes caractères aux valeurs allant de 32 à 127, par conséquent l'application de classements différents n'a aucun effet.

Les règles pour déterminer quel classement ou page de codes est utilisé sur une opération d'exportation en bloc sont les suivantes :

  • Si un classement de colonne est spécifié dans un format de fichier ou en utilisant la fonction ODBC bcp_setcolfmt (bcp_setcolfmt), les données de caractères sont stockées à l'aide de la page de codes ANSI associée au classement.

  • Si aucun classement de colonne n'a été spécifié, mais qu'une page de codes par défaut a été spécifiée à l'aide d'une option de page de codes dans la commande ou de l'indicateur BCPFILECP de bcp_control, toutes les données SQLCHAR provenant des colonnes sans spécification de classement de colonne sont stockées en utilisant la page de codes spécifiée.

    [!REMARQUE]

    Pour plus d'informations sur les options de page de codes, consultez le paragraphe Utilisation d'une page de codes, ci-dessus dans cette rubrique. Pour plus d'informations sur l'indicateur BCPFILECP, consultez bcp_control.

  • Si vous ne spécifiez ni de classement ni de page de codes, les données SQLCHAR sont stockées à l'aide de la page de codes OEM de l'ordinateur client.

[!REMARQUE]

Aucune information sur le classement/page de codes n'est stockée dans un fichier de données.

Importation en bloc de données entre différents classements

Pour une opération d'importation en bloc, l'interprétation de la page de codes s'applique aux colonnes stockées en tant que données au format de caractère SQLCHAR dans un fichier de données. Dans un fichier de données au format de caractère, toutes les colonnes sont stockées en tant que SQLCHAR. Étant donné qu'aucune information sur le classement/la page de codes n'est stockée dans un fichier de données, pour une opération d'importation en bloc, vous devez fournir les informations sur le classement/la page de codes des champs de données.

Les règles pour déterminer quel classement ou page de codes est utilisé sur une opération d'importation en bloc sont les suivantes :

  • Si vous spécifiez un classement de colonne dans un fichier de format ou en utilisant la fonction ODBC bcp_setcolfmt (bcp_setcolfmt), les données SQLCHAR dans un fichier de données sont interprétées à l'aide de la page de codes ANSI associée au classement de la colonne spécifié. Assurez-vous que vos spécifications de classement correspondent aux classements des fichiers de données.

  • Si aucun classement de colonne n'est spécifié, mais qu'une page de codes est spécifiée à l'aide d'une option de page de codes dans la commande ou l'indicateur BCPFILECP de bcp_control, les données SQLCHAR sont interprétées en utilisant la page de codes spécifiée.

    [!REMARQUE]

    Pour plus d'informations sur les options de page de codes, consultez le paragraphe Utilisation d'une page de codes, ci-dessus dans cette rubrique. Pour plus d'informations sur l'indicateur BCPFILECP, consultez bcp_control.

  • Si vous ne spécifiez ni de classement ni de page de codes, les données des colonnes SQLCHAR sont interprétées à l'aide de la page de codes OEM de l'ordinateur client.

Lors d'une opération d'importation en bloc, la spécification de classement gère les éléments suivants :

  • La manière dont l'opération tente d'interpréter la page de codes des colonnes SQLCHAR dans le fichier de données.

  • Le mode d'application de l'indicateur ORDER par bcp ou BULK INSERT, le cas échéant.

    Si vous utilisez l'indicateur ORDER, l'opération d'importation en bloc utilise les classements pour l'interpréter correctement. Cet indicateur s'applique aux colonnes SQLCHAR et SQLNCHAR. Les données dans les colonnes référencées par l'indicateur ORDER doivent se trouver dans l'ordre défini par le classement mappé à ces colonnes. Pour plus d'informations, consultez Contrôle de l'ordre de tri lors de l'importation de données en bloc.