Comment utiliser l’utilitaire bcp

S'applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Base de données SQL dans Microsoft Fabric

L’utilitaire de programme de copie en bloc (bcp) copie en bloc les données entre une instance de SQL Server et un fichier de données dans un format spécifié par l’utilisateur.

Remarques

Prise en charge de fichier de données natif

Dans SQL Server, l’utilitaire bcp prend en charge les fichiers de données natifs compatibles avec les versions de SQL Server à partir de SQL Server 2000 (8.x) et ultérieur.

Colonnes calculées et colonnes horodatage

Les valeurs dans le fichier de données importé pour des colonnes calculées ou timestamp sont ignorées, et SQL Server attribue automatiquement des valeurs. Si le fichier de données ne contient pas de valeurs pour les colonnes calculées ou timestamp de la table, utilisez un fichier de format pour spécifier que les colonnes calculées ou timestamp de la table ne doivent pas être prises en compte lors de l’importation des données ; auquel cas, SQL Server attribue automatiquement des valeurs à la colonne.

Les colonnes calculées et timestamp sont copiées en bloc de SQL Server vers un fichier de données comme d’ordinaire.

Spécifier des identificateurs contenant des espaces ou des guillemets

Les identificateurs SQL Server peuvent inclure des caractères tels que des espaces et des guillemets intégrés. De tels identificateurs doivent être traités de la manière suivante :

  • Quand vous spécifiez, à l'invite de commandes, un identificateur ou un nom de fichier comportant un espace ou une apostrophe, mettez cet identificateur entre guillemets doubles (" ").

    Par exemple, la commande bcp out suivante crée un fichier de données nommé Currency Types.dat:

    bcp AdventureWorks2022.Sales.Currency out "Currency Types.dat" -T -c
    
  • Pour spécifier un nom de base de données comportant un espace ou un guillemet simple, vous devez utiliser l’option -q .

  • Pour les noms de propriétaires, de tables ou de vues contenant des espaces ou des guillemets, vous pouvez :

    • Spécifier l'option -q, ou

    • Placer le nom de propriétaire, de table ou de vue entre crochets ([]), à l'intérieur des guillemets.

Validation des données

bcp applique désormais une validation des données et des contrôles de données qui peuvent entraîner l’échec de scripts existants si ceux-ci sont exécutés sur des données non valides dans un fichier de données. Par exemple, bcp vérifie maintenant que :

  • Les représentations en mode natif des types de données float ou real sont valides.

  • Les données Unicode ont une longueur de nombre d'octets paire.

Les types de données non valides qui pouvaient être importées dans les versions précédentes de SQL Server risquent de ne pas pouvoir être chargés désormais ; tandis que dans les versions précédentes, l'échec ne se produisait que lorsqu'un client tentait d'accéder aux données non valides. La validation supplémentaire réduit les risques d’incidents lors de l’interrogation des données après un chargement en bloc.

Exportation et importation en bloc de documents SQLXML

Pour exporter ou importer en bloc des données SQLXML, utilisez l'un des types de données ci-dessous dans votre fichier de format.

Type de données Résultat
SQLCHAR ou SQLVARYCHAR Les données sont envoyées dans la page de codes client ou dans la page de codes implicite par le classement. L'effet est le même que si vous définissiez le commutateur -c sans spécifier de fichier de format.
SQLNCHAR ou SQLNVARCHAR Les données sont envoyées au format Unicode. L'effet est le même que si vous définissiez le commutateur -w sans spécifier de fichier de format.
SQLBINARY ou SQLVARYBIN Les données sont envoyées sans être converties.

Meilleures pratiques relatives au mode caractère (-c) et au mode natif (-n)

Cette section contient des recommandations pour le mode caractère (-c) et le mode natif (-n).

  • (Administrateur/Utilisateur) Lorsque cela est possible, utilisez le format natif (-n) pour éviter le problème de séparateur. Utilisez le format natif pour exporter et importer à l'aide de SQL Server. Exportez des données à partir de SQL Server à l’aide de l’option -c ou -w si vous envisagez d’exporter les données vers une base de données non-SQL Server.

  • (Administrateur) Vérifiez les données lors de l'utilisation de bcp out. Par exemple, lorsque vous utilisez bcp out, bcp in, puis bcp out, vérifiez que les données sont correctement exportées et que les valeurs de fin ne sont pas utilisées comme partie d'une valeur de données. Remplacez les terminateurs par défaut (en utilisant les options -t et -r) par des valeurs hexadécimales aléatoires afin d’éviter les conflits entre les valeurs de terminateurs et les valeurs de données.

  • (Utilisateur) Utilisez un terminateur long et unique (n'importe quelle séquence d'octets ou de caractères) pour minimiser les risques de conflits avec la valeur de chaîne actuelle. Cette tâche peut être réalisée à l'aide des options -t et -r.

Exemples

Les exemples de cette section utilisent l’exemple de base de données WideWorldImporters pour SQL Server 2016 (13.x) et versions ultérieures, Azure SQL Database et Azure SQL Managed Instance. WideWorldImporters peut être téléchargé depuis https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v1.0. Consultez les instructions RESTORE pour obtenir la syntaxe permettant de restaurer l'exemple de base de données.

Exemples de conditions de test

Sauf mention spécifique contraire, ces exemples partent du principe que vous utilisez l’authentification Windows et que vous disposez d’une connexion approuvée à l’instance du serveur sur laquelle vous exécutez la commande bcp. Un répertoire nommé D:\bcp est utilisé dans de nombreux exemples. Remplacez <server_name> et d’autres valeurs d’espace réservé par des valeurs pour votre environnement.

Le script Transact-SQL suivant crée une copie vide de la WideWorldImporters.Warehouse.StockItemTransactions table, puis ajoute une contrainte de clé primaire :

USE WideWorldImporters;
GO

SET NOCOUNT ON;

IF NOT EXISTS (SELECT *
               FROM sys.tables
               WHERE name = 'Warehouse.StockItemTransactions_bcp')
    BEGIN
        SELECT *
        INTO WideWorldImporters.Warehouse.StockItemTransactions_bcp
        FROM WideWorldImporters.Warehouse.StockItemTransactions
        WHERE 1 = 2;

        ALTER TABLE Warehouse.StockItemTransactions_bcp
        ADD CONSTRAINT PK_Warehouse_StockItemTransactions_bcp
            PRIMARY KEY NONCLUSTERED (StockItemTransactionID ASC);
    END

Vous pouvez tronquer la table StockItemTransactions_bcp autant que nécessaire :

TRUNCATE TABLE WideWorldImporters.Warehouse.StockItemTransactions_bcp;

A. Identifier la version de l’utilitaire bcp

Depuis une invite de commandes, entrez la commande suivante :

bcp -v

B. Copier des lignes de table dans un fichier de données (avec une connexion approuvée)

Les exemples suivants illustrent l’utilisation de l’option out sur la table WideWorldImporters.Warehouse.StockItemTransactions.

  • Basic

    Cet exemple crée un fichier de données nommé StockItemTransactions_character.bcp et y copie les données de table au format caractère .

    Depuis une invite de commandes, entrez la commande suivante :

    bcp WideWorldImporters.Warehouse.StockItemTransactions out D:\bcp\StockItemTransactions_character.bcp -c -T
    
  • Expanded

    Cet exemple crée un fichier de données nommé StockItemTransactions_native.bcp et y copie les données de table au format natif . L’exemple spécifie également le nombre maximum d’erreurs de syntaxe, un fichier d’erreurs et un fichier de sortie.

    Depuis une invite de commandes, entrez la commande suivante :

    bcp WideWorldImporters.Warehouse.StockItemTransactions OUT D:\bcp\StockItemTransactions_native.bcp -m 1 -n -e D:\bcp\Error_out.log -o D:\bcp\Output_out.log -S <server_name> -T
    

Passez en revue Error_out.log et Output_out.log. Error_out.log doit être laissé vide. Comparez les tailles de fichiers entre StockItemTransactions_character.bcp et StockItemTransactions_native.bcp.

Chapitre C. Copier des lignes de table dans un fichier de données (avec une authentification en mode mixte)

L'exemple suivant illustre l'option out sur la table WideWorldImporters.Warehouse.StockItemTransactions. Cet exemple crée un fichier de données nommé StockItemTransactions_character.bcp et y copie les données de table au format caractère .

L’exemple part du principe que vous utilisez l’authentification en mode mixte ; vous devez utiliser le commutateur -U pour spécifier votre ID de connexion. De même, à moins que vous vous connectiez à l’instance par défaut de SQL Server sur l’ordinateur local, utilisez le commutateur -S pour spécifier le nom du système et, éventuellement, un nom d’instance.

À partir d’une invite de commandes, entrez la commande suivante : Le système demande votre mot de passe.

bcp WideWorldImporters.Warehouse.StockItemTransactions out D:\bcp\StockItemTransactions_character.bcp -c -U<login_id> -S<server_name\instance_name>

D. Copier des données depuis un fichier dans une table

Les exemples suivants illustrent l’option in sur la table WideWorldImporters.Warehouse.StockItemTransactions_bcp, à l’aide de fichiers créés précédemment.

  • Basic

    Cet exemple utilise le fichier de données StockItemTransactions_character.bcp créé précédemment.

    Depuis une invite de commandes, entrez la commande suivante :

    bcp WideWorldImporters.Warehouse.StockItemTransactions_bcp IN D:\bcp\StockItemTransactions_character.bcp -c -T
    
  • Expanded

    Cet exemple utilise le fichier de données StockItemTransactions_native.bcp créé précédemment. L’exemple utilise également l’indicateur TABLOCK et spécifie la taille du lot, le nombre maximal d’erreurs de syntaxe, un fichier d’erreur et un fichier de sortie.

    Depuis une invite de commandes, entrez la commande suivante :

    bcp WideWorldImporters.Warehouse.StockItemTransactions_bcp IN D:\bcp\StockItemTransactions_native.bcp -b 5000 -h "TABLOCK" -m 1 -n -e D:\bcp\Error_in.log -o D:\bcp\Output_in.log -S <server_name> -T
    

    Passez en revue Error_in.log et Output_in.log.

E. Copier une colonne spécifique dans un fichier de données

Pour copier une colonne spécifique, vous pouvez utiliser l'option queryout. L'exemple suivant copie uniquement la colonne StockItemTransactionID de la table Warehouse.StockItemTransactions dans un fichier de données.

Depuis une invite de commandes, entrez la commande suivante :

bcp "SELECT StockItemTransactionID FROM WideWorldImporters.Warehouse.StockItemTransactions WITH (NOLOCK)" queryout D:\bcp\StockItemTransactionID_c.bcp -c -T

F. Copier une ligne spécifique dans un fichier de données

Pour copier une ligne spécifique, vous pouvez utiliser l'option queryout. L’exemple suivant copie uniquement la ligne de la personne nommée Amy Trefl de la table WideWorldImporters.Application.People dans un fichier de données Amy_Trefl_c.bcp.

Note

Le -d commutateur est utilisé pour identifier la base de données.

Depuis une invite de commandes, entrez la commande suivante :

bcp "SELECT * from Application.People WHERE FullName = 'Amy Trefl'" queryout D:\bcp\Amy_Trefl_c.bcp -d WideWorldImporters -c -T

G. Copier des données d’une requête dans un fichier de données

Pour copier le jeu de résultats d’une instruction Transact-SQL dans un fichier de données, utilisez l’option queryout . L’exemple suivant copie les noms de la table WideWorldImporters.Application.People , triée en fonction du nom, dans le fichier de données People.txt .

Note

Le commutateur -t est utilisé pour créer un fichier délimité par des virgules.

Depuis une invite de commandes, entrez la commande suivante :

bcp "SELECT FullName, PreferredName FROM WideWorldImporters.Application.People ORDER BY FullName" queryout D:\bcp\People.txt -t, -c -T

H. Créer les fichiers de format

L’exemple suivant crée trois fichiers de format distincts pour la table Warehouse.StockItemTransactions dans la base de données WideWorldImporters . Passez en revue le contenu de chaque fichier créé.

À partir d’une invite de commandes, entrez les commandes suivantes :

REM non-XML character format
bcp WideWorldImporters.Warehouse.StockItemTransactions format nul -f D:\bcp\StockItemTransactions_c.fmt -c -T

REM non-XML native format
bcp WideWorldImporters.Warehouse.StockItemTransactions format nul -f D:\bcp\StockItemTransactions_n.fmt -n -T

REM XML character format
bcp WideWorldImporters.Warehouse.StockItemTransactions format nul -f D:\bcp\StockItemTransactions_c.xml -x -c -T

Note

Le -x interrupteur est pris en charge uniquement sur Windows.

Pour plus d’informations, consultez Utiliser des fichiers de format non XML (SQL Server) et des fichiers de format XML (SQL Server).

I. Utiliser un fichier de format pour une importation en bloc avec bcp

Pour utiliser un fichier de format précédemment créé lors de l’importation de données dans une instance de SQL Server, utilisez le commutateur -f avec l’option in . Par exemple, la commande suivante copie en bloc le contenu d’un fichier de données, StockItemTransactions_character.bcp, dans une copie de la table Warehouse.StockItemTransactions_bcp en utilisant le fichier de format précédemment créé, StockItemTransactions_c.xml.

Note

Le commutateur -L est utilisé pour importer uniquement les 100 premiers enregistrements.

Depuis une invite de commandes, entrez la commande suivante :

bcp WideWorldImporters.Warehouse.StockItemTransactions_bcp in D:\bcp\StockItemTransactions_character.bcp -L 100 -f D:\bcp\StockItemTransactions_c.xml -T

Note

Les fichiers de format s'avèrent utiles lorsque les champs des fichiers de données diffèrent des colonnes de table ; par exemple, par leur nombre, leur ordre ou leurs types de données. Pour plus d’informations, consultez Fichiers de format pour importer ou exporter des données (SQL Server).

J. Spécifier une page de codes

L’exemple d’extrait de code suivant illustre l’importation bcp lors de la spécification d’une page de codes 65001 :

bcp MyTable in "D:\data.csv" -T -c -C 65001 -t , ...

K. Exemple de fichier de sortie utilisant des marques de fin de champ et de ligne personnalisées

Cet exemple montre deux exemples de fichiers, générés par bcp à l’aide de marques de fin de champ et de ligne personnalisées.

  1. Créez une table dbo.T1 dans la base de données tempdb avec deux colonnes, ID et Name.

    USE tempdb;
    GO
    
    CREATE TABLE dbo.T1
    (
        ID INT,
        [Name] NVARCHAR (20)
    );
    GO
    
    INSERT INTO dbo.T1 VALUES (1, N'Natalia');
    INSERT INTO dbo.T1 VALUES (2, N'Mark');
    INSERT INTO dbo.T1 VALUES (3, N'Randolph');
    GO
    
  2. Générez un fichier de sortie à partir de l’exemple de table dbo.T1, en utilisant une marque de fin de champ personnalisée.

    Dans cet exemple, -t , spécifie l’indicateur de fin de champ personnalisé. Remplacez par <server_name> une valeur pour votre environnement.

    bcp dbo.T1 out T1.txt -T -S <server_name> -d tempdb -w -t ,
    

    Voici l'ensemble des résultats.

    1,Natalia
    2,Mark
    3,Randolph
    
  3. Générez un fichier de sortie à partir de l’exemple de table dbo.T1, en utilisant des marques de fin de champ et de ligne personnalisées.

    Dans cet exemple, -t , spécifie l’indicateur de fin de champ personnalisé et -r : spécifie l’indicateur de fin de ligne personnalisé. Remplacez par <server_name> une valeur pour votre environnement.

    bcp dbo.T1 out T1.txt -T -S <server_name> -d tempdb -w -t , -r :
    

    Voici l'ensemble des résultats.

    1,Natalia:2,Mark:3,Randolph:
    

    Note

    Le séparateur de ligne est toujours ajouté, même au dernier enregistrement. Toutefois, la marque de fin de champ n’est pas ajoutée au dernier champ.

Exemples supplémentaires

Les articles suivants contiennent des exemples d’utilisation de bcp :

Obtenir de l’aide

Contribuer à la documentation SQL

Saviez-vous que vous pouvez modifier le contenu SQL vous-même ? Si vous le faites, non seulement vous aidez à améliorer notre documentation, mais vous obtenez également un crédit en tant que contributeur à la page.

Pour plus d’informations, consultez Modifier la documentation Microsoft Learn.