Partager via


ENCART EN VRAC (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceEntrepôt dans Microsoft Fabric

Importe un fichier de données dans une table de base de données ou une vue dans un format spécifié par l’utilisateur dans SQL Server.

Conventions de la syntaxe Transact-SQL

Syntaxe

BULK INSERT
   { database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }
      FROM 'data_file'
     [ WITH
    (
   [ [ , ] DATA_SOURCE = 'data_source_name' ]

   -- text formatting options
   [ [ , ] CODEPAGE = { 'RAW' | 'code_page' | 'ACP' | 'OEM' } ]
   [ [ , ] DATAFILETYPE = { 'char' | 'widechar' | 'native' | 'widenative' } ]
   [ [ , ] ROWTERMINATOR = 'row_terminator' ]
   [ [ , ] FIELDTERMINATOR = 'field_terminator' ]
   [ [ , ] FORMAT = 'CSV' ]
   [ [ , ] FIELDQUOTE = 'quote_characters' ]
   [ [ , ] FIRSTROW = first_row ]
   [ [ , ] LASTROW = last_row ]

   -- input file format options
   [ [ , ] FORMATFILE = 'format_file_path' ]
   [ [ , ] FORMATFILE_DATA_SOURCE = 'data_source_name' ]

   -- error handling options
   [ [ , ] MAXERRORS = max_errors ]
   [ [ , ] ERRORFILE = 'file_name' ]
   [ [ , ] ERRORFILE_DATA_SOURCE = 'errorfile_data_source_name' ]

   -- database options
   [ [ , ] KEEPIDENTITY ]
   [ [ , ] KEEPNULLS ]
   [ [ , ] FIRE_TRIGGERS ]
   [ [ , ] CHECK_CONSTRAINTS ]
   [ [ , ] TABLOCK ]

   -- source options
   [ [ , ] ORDER ( { column [ ASC | DESC ] } [ , ...n ] ) ]
   [ [ , ] ROWS_PER_BATCH = rows_per_batch ]
   [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]
   [ [ , ] BATCHSIZE = batch_size ]

    ) ]
BULK INSERT
   { database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }
      FROM 'data_file'
     [ WITH
    (
   [ [ , ] DATA_SOURCE = 'data_source_name' ]

   -- text formatting options
   [ [ , ] CODEPAGE = { 'code_page' | 'ACP' } ]
   [ [ , ] DATAFILETYPE = { 'char' | 'widechar' } ]
   [ [ , ] ROWTERMINATOR = 'row_terminator' ]
   [ [ , ] FIELDTERMINATOR = 'field_terminator' ]
   [ [ , ] FORMAT = { 'CSV' | 'PARQUET' } ]
   [ [ , ] FIELDQUOTE = 'quote_characters' ]
   [ [ , ] FIRSTROW = first_row ]
   [ [ , ] LASTROW = last_row ]

   -- input file format options
   [ [ , ] FORMATFILE = 'format_file_path' ]
   [ [ , ] FORMATFILE_DATA_SOURCE = 'data_source_name' ]

   -- error handling options
   [ [ , ] MAXERRORS = max_errors ]
   [ [ , ] ERRORFILE = 'file_name' ]
   [ [ , ] ERRORFILE_DATA_SOURCE = 'errorfile_data_source_name' ]

    ) ]

Les arguments

L’instruction BULK INSERT a différents arguments et options dans différentes plateformes. Les différences sont résumées dans le tableau suivant :

Caractéristique Serveur SQL Azure SQL Database et Azure SQL Managed Instance Entrepôt de données Fabric
Source de données Chemin d’accès local, chemin d’accès réseau (UNC) ou Stockage Azure Stockage Azure Azure Storage, One Lake
Authentification source Authentification Windows, SAP ID Microsoft Entra, jeton SAS, identité managée Microsoft Entra ID (système d'identification de Microsoft)
Options non prises en charge * Cartes sauvages dans la trajectoire, FORMAT = 'PARQUET' * Cartes sauvages dans la trajectoire, FORMAT = 'PARQUET' DATAFILETYPE = {'native' | 'widenative'}
Options activées, mais sans effet KEEPIDENTITY, , FIRE_TRIGGERS, CHECK_CONSTRAINTSTABLOCK, ORDER, ROWS_PER_BATCH, , KILOBYTES_PER_BATCHet BATCHSIZE ne sont pas applicables. Ils ne lèvent pas d’erreur de syntaxe, mais ils n’ont aucun effet

database_name

Nom de la base de données qui contient la table ou la vue spécifiée. Si aucun nom n’est spécifié, database_name est la base de données actuelle.

schema_name

Spécifie le nom du schéma de la table ou de la vue. schema_name est facultatif si le schéma par défaut de l’utilisateur réalisant l’opération d’importation en bloc est le schéma de la table ou de la vue spécifiée. Si schema n’est pas spécifié et que le schéma par défaut de l’utilisateur qui effectue l’opération d’importation en bloc diffère de celui de la table ou de la vue spécifiée, SQL Server retourne un message d’erreur et l’opération d’importation en bloc est annulée.

table_name

Spécifie le nom de la table ou de la vue dans laquelle les données doivent être importées en bloc. Seules des vues dans lesquelles toutes les colonnes font référence à la même table de base peuvent être utilisées. Pour plus d’informations sur les restrictions de chargement des données dans des vues, consultez INSERT.

EXTRAIT DE 'data_file'

Spécifié le chemin complet du fichier de données contenant les données à importer dans la table ou la vue spécifiée.

BULK INSERT peut importer des données depuis un disque ou un stockage Azure (y compris le réseau, la disquette, le disque dur, etc.).

BULK INSERT bing_covid_19_data
FROM 'C:\\bing_covid-19_data\public\curated\covid-19\latest\bing_covid-19_data.csv';

data_file doit spécifier un chemin valide à partir du serveur où SQL Server s’exécute. Si data_file correspond à un fichier distant, spécifiez le nom UNC (Universal Naming Convention). Un nom UNC présente le format \\SystemName\ShareName\Path\FileName. Par exemple :

BULK INSERT bing_covid_19_data
FROM '\\ShareX\bing_covid-19_data\public\curated\covid-19\latest\bing_covid-19_data.csv';

Azure SQL Database et Fabric Data Warehouse prennent en charge la lecture des données depuis l’URI, mais ils ne prennent pas en charge les chemins de fichiers sur site.

BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv';

À partir de SQL Server 2017 (14.x), la data_file peut être dans Azure Storage. Dans ce cas, vous devez également spécifier data_source_name l’option. Pour un exemple, voir Importer des données à partir d’un fichier dans Azure Storage.

Fabric Data Warehouse prend en charge deux styles de chemins différents pour spécifier le chemin source :

  • https://<storage account>.blob.core.windows.net/<container name>/<path to file>
  • abfss://<container name>@<storage account>.dfs.core.windows.net/<path to file>

Fabric Data Warehouse prend en charge * les jokers pouvant correspondre à n’importe quel caractère de l’URI, et vous permet de définir un motif d’URI pour les fichiers à importer. Par exemple :

BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/*.csv';

Notes

Remplacez par <data-lake>.blob.core.windows.net une URL appropriée.

DATA_SOURCE

S’applique à : SQL Server 2017 (14.x) et versions ultérieures, Azure SQL Database, et Warehouse dans Microsoft Fabric.

Spécifie une source de données externe nommée qui pointe vers une racine Azure Storage pour l’importation du fichier.

CREATE EXTERNAL DATA SOURCE pandemicdatalake
WITH (LOCATION = 'https://<data-lake>.blob.core.windows.net/public/');

Notes

Remplacez par <data-lake>.blob.core.windows.net une URL appropriée.

Pour plus d’informations, consultez CRÉER UNE SOURCE DE DONNÉES EXTERNES.

Le chemin du fichier dans la FROM clause doit être un chemin relatif, qui sera ajouté à la racine définie dans la source de données externe.

BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2, LASTROW = 100, FIELDTERMINATOR = ',');

Notes

Pour simplifier, les exemples suivants utilisent des chemins relatifs et des sources de données externes prédéfinies.

CODEPAGE

Indique la page de codes des données dans le fichier. CODEPAGE est pertinent uniquement si les données contiennent des colonnes char, varchar ou texte avec des valeurs de caractères supérieures 127 ou inférieures à 32. Pour obtenir un exemple, consultez Spécifier une page de codes.

BULK INSERT bing_covid_19_data
FROM '/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2, CODEPAGE = '65001');

CODEPAGE n’est pas une option prise en charge sur Linux pour SQL Server 2017 (14.x). Pour SQL Server 2019 (15.x), seule l’option 'RAW' est autorisée pour CODEPAGE.

Vous devez spécifier un nom de classement pour chaque colonne dans un fichier de format.

valeur CODEPAGE Descriptif
ACP Les colonnes du type de données char, varchar ou text sont converties de la page de codes ANSI/Microsoft Windows (ISO 1252) à la page de codes SQL Server.
OEM (valeur par défaut) Les colonnes de type de données char, varchar ou texte sont converties de la page de codes système OEM vers la page de codes SQL Server.
RAW Aucune conversion d'une page de codes vers une autre n'a lieu. RAW est l’option la plus rapide.
code_page Numéro de la page de codes, par exemple 850.

Les versions antérieures à SQL Server 2016 (13.x) ne prennent pas en charge la page de codes 65001 (encodage UTF-8).
valeur CODEPAGE Descriptif
ACP Les colonnes du type de données char, varchar ou text sont converties de la page de codes ANSI/Microsoft Windows (ISO 1252) à la page de codes SQL Server.
code_page Numéro de la page de codes, par exemple 850.

Les versions antérieures à SQL Server 2016 (13.x) ne prennent pas en charge la page de codes 65001 (encodage UTF-8).

DATAFILETYPE

Spécifie qui BULK INSERT effectue l’opération d’importation à l’aide de la valeur de type de fichier de données spécifiée.

BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2, DATAFILETYPE = 'char');

Notes

Remplacez par <data-lake>.blob.core.windows.net une URL appropriée.

valeur DATAFILETYPE Toutes les données représentées dans
char (valeur par défaut) Format caractères.

Pour plus d’informations, voir Utiliser le format de caractère pour importer ou exporter des données.
widechar Caractères Unicode.

Pour plus d’informations, voir Utiliser le format de caractères Unicode pour importer ou exporter des données.
native Types de données (base de données) natif. Créer le fichier de données natif en important en bloc les données à partir de SQL Server à l’aide de l’utilitaire bcp.

La valeur native offre de meilleures performances que la valeur char. Il est recommandé d’utiliser le format natif quand vous transférez des données en bloc entre plusieurs instances SQL Server au moyen d’un fichier de données qui ne contient pas de caractères d’un jeu de caractères étendus/codés sur deux octets (DBCS).

Pour plus d’informations, voir Utiliser le format natif pour importer ou exporter des données.
widenative Types de données (base de données) natif, à l’exception des colonnes de type char, varchar et text dans lesquelles les données sont stockées au format Unicode. Créez le widenative fichier de données en important des données à partir de SQL Server à l’aide de l’utilitaire bcp .

La widenative valeur offre une alternative plus performante à widechar. Si le fichier de données contient des caractères étendus ANSI, spécifiez widenative.

Pour plus d’informations, voir Utiliser le format natif Unicode pour importer ou exporter des données.
valeur DATAFILETYPE Toutes les données représentées dans
char (valeur par défaut) Format caractères.

Pour plus d’informations, voir Utiliser le format de caractère pour importer ou exporter des données.
widechar Caractères Unicode.

Pour plus d’informations, voir Utiliser le format de caractères Unicode pour importer ou exporter des données.

MAXERRORS

Nombre maximal d'erreurs de syntaxe tolérées dans les données avant l'annulation de l'importation en bloc. Chaque ligne ne pouvant pas être importée par l’opération d’importation en bloc est ignorée et comptabilisée comme une erreur. Si max_errors n’est pas spécifié, la valeur par défaut est 10.

BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', MAXERRORS = 0);

Cette MAX_ERRORS option ne s’applique pas aux contrôles de contraintes ni à la conversion de types de données d’argent et bigint .

FICHIER ERREUR

Fichier utilisé pour collecter les lignes comportant des erreurs de mise en forme et ne pouvant pas être converties en un ensemble de lignes OLE DB. Ces lignes sont copiées « en l'état » du fichier de données vers ce fichier d'erreur.

BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake',
      ERRORFILE = 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/errors');

Notes

Remplacez par <data-lake>.blob.core.windows.net une URL appropriée.

Le fichier d'erreur est créé lors de l'exécution de la commande. Une erreur se produit si le fichier existe déjà. En outre, un fichier de contrôle avec l’extension .ERROR.txt est créé, qui fait référence à chaque ligne du fichier d’erreur et fournit des diagnostics d’erreur. Dès que les erreurs ont été corrigées, les données peuvent être chargées.

À partir de SQL Server 2017 (14.x), le error_file_path peut être dans Azure Storage.

SOURCE_DE_DONNÉES_FICHIER_D_ERREUR

S’applique à : SQL Server 2017 (14.x) et versions ultérieures.

Spécifie une source de données externe nommée pointant vers l’emplacement Azure Storage du fichier d’erreur pour suivre les erreurs trouvées lors de l’importation.

BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (
    DATA_SOURCE = 'pandemicdatalake',
    ERRORFILE = 'curated/covid-19/bing_covid-19_data/latest/errors',
    ERRORFILE_DATA_SOURCE = 'pandemicdatalake'
);

Pour plus de détails sur la création de sources de données externes, voir CRÉER UNE SOURCE DE DONNÉES EXTERNE.

PREMIÈRE RANGÉE

Numéro de la première ligne à charger. La valeur par défaut est la première ligne du fichier de données spécifié. FIRSTROW est basé sur 1.

BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2);

L’attribut FIRSTROW n’est pas destiné à ignorer les en-têtes de colonne. L’instruction BULK INSERT ne prend pas en charge l’ignorer des en-têtes. Si vous choisissez d’ignorer des lignes, le Moteur de base de données SQL Server examine uniquement les marques de fin de champ et ne valide pas les données figurant dans les champs des lignes ignorées.

DERNIER CHEMIN

Numéro de la dernière ligne à charger. La valeur par défaut est 0, c'est-à-dire la dernière ligne du fichier de données spécifié.

TAILLE DU LOT

Indique le nombre de lignes contenues dans un lot. Chaque lot est copié sur le serveur comme une transaction unique. En cas d'échec, SQL Server valide ou annule la transaction pour chaque lot. Par défaut, toutes les données du fichier spécifié constituent un seul lot. Pour plus d’informations sur les performances, consultez les Considérations relatives aux performances dans la suite de cet article.

CONTRAINTES_DE_VÉRIFICATION

Spécifie que toutes les contraintes sur la table ou vue cible doivent être vérifiées pendant l'opération d'importation en bloc. Sans l’option CHECK_CONSTRAINTS , aucune CHECK contrainte n’est FOREIGN KEY ignorée, et après l’opération, la contrainte sur la table est marquée comme non approuvée.

UNIQUE et PRIMARY KEY les contraintes sont toujours appliquées. Lors de l’importation dans une colonne de caractères définie avec une NOT NULL contrainte, BULK INSERT insère une chaîne vide en l’absence de valeur dans le fichier texte.

À un certain moment, il devient nécessaire d'examiner les contraintes définies sur l'ensemble de la table. Si la table n’était pas vide avant l’opération d’importation en bloc, le coût de revalidation de la contrainte peut dépasser le coût de l’application CHECK de contraintes aux données incrémentielles.

Il peut notamment convenir de désactiver les contraintes (comportement par défaut) si les données d'entrée contiennent des lignes qui violent des contraintes. Avec CHECK les contraintes désactivées, vous pouvez importer les données, puis utiliser des instructions Transact-SQL pour supprimer les données non valides.

Notes

L’option MAXERRORS ne s’applique pas à la vérification des contraintes.

Déclencheurs d'incendie

Spécifie que tous les déclencheurs d'insertion définis sur la table de destination seront exécutés au cours de l'opération d'importation en bloc. Si des déclencheurs sont définis pour INSERT les opérations sur la table cible, ils sont déclenchés pour chaque lot terminé.

Si FIRE_TRIGGERS ce n’est pas spécifié, aucun déclencheur d’insertion n’est exécuté.

CONSERVERL'IDENTITÉ

Indique que la ou les valeurs d'identité figurant dans le fichier de données importé doivent être utilisées dans la colonne d'identité. Si KEEPIDENTITY elle n’est pas spécifiée, les valeurs d’identité de cette colonne sont vérifiées, mais pas importées et SQL Server affecte automatiquement des valeurs uniques en fonction des valeurs initiales et incrémentées spécifiées lors de la création de la table. Si le fichier de données ne contient pas de valeurs pour la colonne d’identité de la table ou de la vue, utilisez un fichier de format pour spécifier que la colonne d’identité doit être ignorée lors de l’importation des données. Dans ce cas, SQL Server attribue automatiquement des valeurs uniques à la colonne. Pour plus d’informations, consultez DBCC CHECKIDENT.

Pour plus d’informations, voir pour conserver les valeurs d’identification, voir Conserver les valeurs d’identité lors de l’importation massive de données.

KEEPNULLS

Spécifie que pendant l'importation en bloc les colonnes vides doivent conserver la valeur NULL au lieu d'insérer des valeurs par défaut dans ces colonnes. Pour plus d’informations, voir Conserver les valeurs nulles ou par défaut lors de l’importation en masse.

KILOBYTES_PER_BATCH

Indique le nombre approximatif de kilo-octets (Ko) de données par lot sous la forme kilobytes_per_batch. Par défaut, KILOBYTES_PER_BATCH est inconnu. Pour plus d’informations sur les performances, consultez les Considérations relatives aux performances dans la suite de cet article.

COMMANDE

Indique l'ordre de tri des données dans le fichier. Les performances de l'importation en bloc sont améliorées si les données importées sont triées en fonction de l'index cluster de la table, le cas échéant. Si le fichier de données est trié dans un ordre autre que l’ordre d’une clé d’index cluster, ou s’il n’y a pas d’index cluster sur la table, la ORDER clause est ignorée. Les noms de colonnes fournis doivent être des noms de colonnes valides dans la table de destination. Par défaut, l'opération d'insertion en bloc considère que le fichier de données n'est pas ordonné. Pour une importation en bloc optimisée, SQL Server valide également le fait que les données importées sont triées.

n est un espace réservé qui indique que plusieurs colonnes peuvent être spécifiées.

ROWS_PER_BATCH

Nombre approximatif de lignes de données que compte le fichier de données.

Par défaut, toutes les données du fichier de données sont envoyées au serveur en une seule transaction, et le nombre de lignes du lot est inconnu de l'optimiseur de requête. Si vous spécifiez ROWS_PER_BATCH (avec une valeur > 0), le serveur utilise cette valeur pour optimiser l’opération d’importation en bloc. La valeur spécifiée ROWS_PER_BATCH pour doit être approximativement identique au nombre réel de lignes. Pour plus d’informations sur les performances, consultez les Considérations relatives aux performances dans la suite de cet article.

TABLOCK

Spécifie qu'un verrou de niveau table est acquis pour la durée de l'opération d'importation en bloc. Une table peut être chargée simultanément par plusieurs clients si la table n’a pas d’index et TABLOCK est spécifiée. Par défaut, le comportement du verrouillage est déterminé par l'option table lock on bulk load. En verrouillant la table pendant la durée de l'importation en bloc, vous réduisez la contention de verrouillage et augmentez considérablement, dans certains cas, les performances. Pour plus d’informations sur les performances, consultez les Considérations relatives aux performances dans la suite de cet article.

Le comportement de verrouillage est différent, car il est divisé en interne en plusieurs ensembles de lignes. Chaque thread charge des données exclusivement dans chaque ensemble de lignes en prenant un verrou exclusif (X) sur l’ensemble de lignes, ce qui permet de charger des données parallèles avec des sessions de chargement simultanées de données. L’utilisation de TABLOCK l’option entraîne le verrouillage exclusif du thread sur la table (contrairement au verrou de mise à jour en bloc (BU) pour les ensembles de lignes traditionnels, ce qui empêche d’autres threads simultanés de charger des données simultanément.

Options de format de fichier d’entrée

FORMAT

S’applique à : SQL Server 2017 (14.x) et versions ultérieures.

spécifie un fichier de valeurs séparées par des virgules conformément à la norme RFC 4180.

BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FORMAT = 'CSV');

Dans Fabric Data Warehouse, l’instruction BULK INSERT prend en charge les mêmes formats que l’instruction COPY INTO , ce qui l’est donc FORMAT = 'PARQUET' également.

CITATION DE TERRAIN

S’applique à : SQL Server 2017 (14.x) et versions ultérieures.

Spécifie un caractère à utiliser comme caractère de guillemet dans le fichier CSV. S’il n’est pas spécifié, le caractère de guillemet (") est utilisé comme caractère de guillemet, tel que défini dans la norme RFC 4180 .

FORMATFILE

Spécifie le chemin complet au fichier de format. Un fichier de format décrit le fichier de données qui contient les réponses stockées créées à l’aide de l’utilitaire bcp dans la même table ou vue.

BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake',
      FORMATFILE = 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.fmt');

Notes

Remplacez par <data-lake>.blob.core.windows.net une URL appropriée.

Le fichier de format doit être utilisé dans les contextes suivants :

  • Le fichier de données contient plus ou moins de colonnes que la table ou la vue.
  • Les colonnes sont ordonnées différemment.
  • Les délimiteurs de colonne sont différents.
  • Le format des données présente d'autres changements. Les fichiers de format sont généralement créés au moyen de l’utilitaire bcp, puis modifiés, au besoin, à l’aide d’un éditeur de texte. Pour plus d’informations, voir l’utilitaire bcp et Créer un fichier de formatage avec bcp.

À partir de SQL Server 2017 (14.x), et dans Azure SQL Database, format_file_path cela peut être dans Azure Storage.

FORMATFILE_DATA_SOURCE

S’applique à : SQL Server 2017 (14.x) et versions ultérieures.

Spécifie une source de données externe nommée pointant vers l’emplacement Azure Storage du fichier de format pour définir le schéma des données importées.

BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (
    DATA_SOURCE = 'pandemicdatalake',
    FORMATFILE = 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.fmt',
    FORMATFILE_DATA_SOURCE = 'pandemicdatalake'
);

FIELDTERMINATOR

Spécifie le terminateur de champ à utiliser et charwidechar les fichiers de données. La marque de fin de champ par défaut est \t (caractère de tabulation). Pour plus d’informations, consultez Spécifier les indicateurs de fin de champ et de ligne.

BULK INSERT bing_covid_19_data
FROM '/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIELDTERMINATOR = ',', FIRSTROW = 2);

ROWTERMINATOR

Spécifie le terminateur de ligne à utiliser et charwidechar les fichiers de données.

BULK INSERT bing_covid_19_data
FROM '/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', ROWTERMINATOR = '\r\n', FIRSTROW = 2);

Le terminateur de ligne par défaut est \r\n (retour de chariot et caractère de nouvelle ligne). Pour plus d’informations, consultez Spécifier les indicateurs de fin de champ et de ligne.

Compatibilité

BULK INSERT applique une validation de données stricte et des vérifications de données de données lues à partir d’un fichier pouvant entraîner l’échec des scripts existants lorsqu’ils sont exécutés sur des données non valides. Par exemple, BULK INSERT vérifie que :

  • Les représentations en mode natif des types de données float ou real sont valides.
  • les données Unicode comportent un nombre d'octets pair.

Types de données

Conversion du type de données chaîne en décimal

Les conversions de type de données chaîne à décimale utilisées dans BULK INSERT les mêmes règles que la fonction CONVERT Transact-SQL, qui rejette les chaînes représentant des valeurs numériques qui utilisent la notation scientifique. Par conséquent, BULK INSERT traite ces chaînes comme des valeurs non valides et signale des erreurs de conversion.

Pour contourner ce problème, utilisez un fichier de format permettant d’importer en bloc des données de type float à notation scientifique dans une colonne décimale. Dans le fichier de format, décrivez explicitement la colonne comme étant de type real ou float. Pour plus d’informations sur ces types de données, consultez float et real.

Les fichiers de format représentent des données real en tant que type de données SQLFLT4, et des données float en tant que type de données SQLFLT8. Pour des informations sur les fichiers au format non-XML, voir Spécifier le type de stockage de fichier à l’aide de bcp.

Exemple d’importation d’une valeur numérique qui utilise la notation scientifique

Cet exemple utilise la table suivante dans la base de données bulktest :

CREATE TABLE dbo.t_float
(
    c1 FLOAT,
    c2 DECIMAL (5, 4)
);

L'utilisateur veut importer des données en bloc dans la table t_float. Le fichier de données, C:\t_float-c.datcontient des données float de notation scientifique ; par exemple :

8.0000000000000002E-2 8.0000000000000002E-2

Quand vous copiez cet exemple, faites attention aux différents éditeurs et encodages de texte qui enregistrent les caractères de tabulation (\t) comme des espaces. Un caractère de tabulation est attendu plus loin dans cet exemple.

Toutefois, BULK INSERT ne peut pas importer ces données directement dans t_float, car sa deuxième colonne, c2utilise le type de données décimal . Un fichier de format est donc nécessaire, Il doit mapper les données float à notation scientifique au format décimal de la colonne c2.

Le fichier de format suivant utilise le type de données SQLFLT8 pour mapper le deuxième champ de données à la deuxième colonne :

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <RECORD>
    <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="30" />
    <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="30" />
  </RECORD>
  <ROW>
    <COLUMN SOURCE="1" NAME="c1" xsi:type="SQLFLT8" />
    <COLUMN SOURCE="2" NAME="c2" xsi:type="SQLFLT8" />
  </ROW>
</BCPFORMAT>

Si vous voulez opter pour ce fichier de format (avec le nom de fichier C:\t_floatformat-c-xml.xml) afin d'importer les données de test dans la table de test, exécutez l'instruction Transact-SQL suivante :

BULK INSERT bulktest.dbo.t_float
FROM 'C:\t_float-c.dat'
WITH (FORMATFILE = 'C:\t_floatformat-c-xml.xml');

Important

Azure SQL Database et Fabric Data Warehouse ne prennent en charge que la lecture à partir d’URI (par exemple, Azure Storage).

Types de données pour l’importation et l’exportation 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 SQLVARCHAR Les données sont envoyées dans la page de codes du client ou dans la page de codes impliquée par le classement. L’effet est le même que la spécification du DATAFILETYPE = 'char' fichier de format 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 la spécification du DATAFILETYPE = 'widechar' fichier de format sans spécifier de fichier de format.
SQLBINARY ou SQLVARBIN Les données sont envoyées sans être converties.

Remarques

Pour une comparaison de l’énoncé BULK INSERT , de l’instruction INSERT ... SELECT * FROM OPENROWSET(BULK...) et de la bcp commande, voir Importation et Exportation en masse de données.

Pour plus d’informations sur la préparation des données pour l’importation en bloc, consultez Préparer des données pour l’exportation en bloc ou l’importation.

L’instruction BULK INSERT peut être exécutée dans une transaction définie par l’utilisateur pour importer des données dans une table ou une vue. Si vous le souhaitez, pour utiliser plusieurs correspondances pour l’importation en bloc de données, une transaction peut spécifier la BATCHSIZE clause dans l’instruction BULK INSERT . Si une transaction par lots multiples est restaurée, chaque lot envoyé à SQL Server est restauré.

Interopérabilité

Importer des données à partir d'un fichier CSV

À compter de SQL Server 2017 (14.x), BULK INSERT prend en charge le format CSV, comme Azure SQL Database.

Avant SQL Server 2017 (14.x), les fichiers CSV (valeurs séparées par des virgules) ne sont pas pris en charge par les opérations d’importation en bloc SQL Server. Toutefois, dans certains cas, un fichier CSV peut être utilisé comme fichier de données pour une importation en bloc de données dans SQL Server. Pour plus d’informations sur la configuration requise pour l’importation de données à partir d’un fichier de données CSV, consultez Préparer des données pour l’exportation en bloc ou l’importation.

Comportement du journal

Pour plus d’informations sur le moment où les opérations d’insertion de ligne effectuées par l’importation en bloc dans SQL Server sont enregistrées dans le journal des transactions, consultez Conditions préalables pour la journalisation minimale dans l’importation en bloc. La journalisation minimale n’est pas prise en charge dans Azure SQL Database.

Limites

Lorsque vous utilisez un fichier de format avec BULK INSERT, vous pouvez spécifier jusqu’à 1 024 champs uniquement. Il s'agit du nombre maximal de colonnes autorisé dans une table. Si vous utilisez un fichier de format avec BULK INSERT un fichier de données contenant plus de 1 024 champs, BULK INSERT génère l’erreur 4822. L’utilitaire bcp n’a pas cette limitation. Par conséquent, pour les fichiers de données qui contiennent plus de 1 024 champs, utilisez BULK INSERT sans fichier de format ou utilisez la commande bcp.

Considérations relatives aux performances

Si le nombre de pages à vider dans un lot unique dépasse un seuil interne, une analyse complète du pool de mémoires tampons peut s'effectuer afin d'identifier les pages à vider lors de la validation du lot. Cette analyse complète peut nuire aux performances de l'importation en bloc. Le dépassement du seuil interne se produit lorsqu'un pool de mémoires tampons de grande taille est associé à un sous-système d'E/S lent. Pour éviter les dépassements de mémoire tampon sur les machines volumineuses, n’utilisez pas l’indicateur TABLOCK (qui supprime les optimisations en bloc) ou utilisez une taille de lot plus petite (qui conserve les optimisations en bloc).

Vous devez tester différentes tailles de lot avec votre charge de données pour trouver la solution la mieux adaptée. N’oubliez pas que la taille du lot a des implications partielles sur la restauration. Si votre processus échoue et avant d’utiliser BULK INSERT à nouveau, vous devrez peut-être effectuer des tâches manuelles supplémentaires pour supprimer une partie des lignes qui ont été insérées avec succès, avant qu’une défaillance ne se produise.

Avec Azure SQL Database, envisagez d’augmenter temporairement le niveau de performances de la base de données ou de l’instance avant l’importation si vous importez un grand volume de données.

Sécurité

Délégation de compte de sécurité (emprunt d’identité)

Si un utilisateur a recours à une connexion SQL Server , le profil de sécurité du compte du processus SQL Server est alors utilisé. Une connexion via l’authentification SQL Server ne peut pas être authentifiée en dehors du Moteur de base de données. Par conséquent, lorsqu’une commande est lancée par une BULK INSERT connexion à l’aide de l’authentification SQL Server, la connexion aux données est établie à l’aide du contexte de sécurité du compte de processus SQL Server (compte utilisé par le service moteur de base de données SQL Server).

Pour lire correctement les données sources, vous devez accorder au compte utilisé par le moteur de base de données SQL Server l’accès aux données sources. Par opposition, si un utilisateur SQL Server s'est connecté via l'authentification Windows, il peut lire uniquement les fichiers accessibles par le compte d'utilisateur, indépendamment du profil de sécurité du processus SQL Server .

Lors de l’exécution de l’instruction BULK INSERT à l’aide de sqlcmd ou osql, à partir d’un ordinateur, l’insertion de données dans SQL Server sur un deuxième ordinateur et la spécification d’un data_file sur un troisième ordinateur à l’aide d’un chemin UNC, vous pouvez recevoir une erreur 4861.

Pour résoudre cette erreur, utilisez l’authentification SQL Server et spécifiez une connexion SQL Server utilisant le profil de sécurité du compte de processus SQL Server, ou configurez Windows de façon à activer la délégation de compte de sécurité. Pour plus d'informations sur l'activation d'un compte d'utilisateur en vue de son approbation pour la délégation, consultez l'aide de Windows.

Pour plus d’informations sur cette procédure et d’autres considérations de sécurité à prendre en compte pour l’utilisation BULK INSERT, consultez Utiliser BULK INSERT ou OPENROWSET(BULK...) pour importer des données dans SQL Server.

Lorsque vous importez depuis Azure Storage et que les données ne sont pas publiques (accès anonyme), créez un IDENTIFIANT AVEC UN CHAMP DE DONNÉES basé sur une clé SAS chiffrée avec une clé maîtresse de base de données (DMK), puis créez une source de base de données externe à utiliser dans votre BULK INSERT commande.

Vous pouvez également créer un DATABASE SCOPED CREDENTIAL basé sur MANAGED IDENTITY pour autoriser les demandes d’accès aux données dans des comptes de stockage non publics. Lors de l’utilisation MANAGED IDENTITYde , Azure Storage doit accorder des permissions à l’identité gérée de l’instance en ajoutant le rôle intégré de contrôle d’accès basé sur le rôle (RBAC) Azure Blob Data Contributor , qui fournit un accès en lecture/écriture à l’identité gérée pour les conteneurs Azure Storage nécessaires. Les instances Azure SQL Managed Instance ont une identité managée affectée par le système, et peuvent également avoir une ou plusieurs identités managées affectées par l’utilisateur. Vous pouvez utiliser aussi bien des identités managées affectées par le système que des identités managées affectées par l’utilisateur pour autoriser les demandes. Pour l’autorisation, l’identité default de l’instance managée est utilisée (autrement dit, l’identité managée affectée par l’utilisateur principale ou l’identité managée affectée par le système si l’identité managée affectée par l’utilisateur n’est pas spécifiée). Pour un exemple, voir Importer des données à partir d’un fichier dans Azure Storage.

Important

L’identité gérée s’applique à Azure SQL, ainsi qu’à SQL Server 2025 (17.x) et versions ultérieures.

Autorisations

Les autorisations suivantes s’appliquent à l’emplacement où les données sont importées en bloc (la cible).

Nécessite INSERT et ADMINISTER BULK OPERATIONS autorisations. Dans Azure SQL Database, INSERT et ADMINISTER DATABASE BULK OPERATIONS les autorisations sont requises. ADMINISTER BULK OPERATIONS les autorisations ou le rôle bulkadmin ne sont pas pris en charge pour SQL Server sur Linux. Seul le sysadmin peut effectuer des insertions en bloc pour SQL Server sur Linux.

En outre, ALTER TABLE l’autorisation est requise si une ou plusieurs des conditions suivantes sont remplies :

  • Les contraintes existent et l’option CHECK_CONSTRAINTS n’est pas spécifiée.

    La désactivation des contraintes est le comportement par défaut. Pour vérifier explicitement les contraintes, utilisez l’option CHECK_CONSTRAINTS .

  • Les déclencheurs existent et l’option FIRE_TRIGGER n’est pas spécifiée.

    Par défaut, les déclencheurs ne sont pas activés. Pour déclencher des déclencheurs explicitement, utilisez l’option FIRE_TRIGGER .

  • Vous utilisez l’option pour importer la KEEPIDENTITY valeur d’identité à partir du fichier de données.

Exemples

Les exemples de code de cet article utilisent les bases de données d'exemple AdventureWorks2025 ou AdventureWorksDW2025, que vous pouvez télécharger à partir de la page d'accueil Microsoft SQL Server Samples and Community Projects.

Important

Azure SQL Database et Fabric Warehouse ne prennent en charge que la lecture depuis Azure Storage.

R. Utiliser des canaux pour l’importation des données d'un fichier

L'exemple suivant importe des informations détaillées de commande dans la table AdventureWorks2022.Sales.SalesOrderDetail, à partir du fichier de données spécifié en utilisant le caractère | comme marque de fin de champ et |\n comme marque de fin de ligne.

BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH (FIELDTERMINATOR = ' |', ROWTERMINATOR = ' |\n');

B. Utiliser l'argument FIRE_TRIGGERS

L'exemple suivant spécifie l'argument FIRE_TRIGGERS.

BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH (FIELDTERMINATOR = ' |', ROWTERMINATOR = ':\n', FIRE_TRIGGERS);

Chapitre C. Utiliser le saut de ligne comme marque de fin de ligne

L'exemple suivant importe un fichier qui utilise le retour à la ligne comme marque de fin de ligne, par exemple une sortie UNIX :

DECLARE @bulk_cmd AS VARCHAR (1000);

SET @bulk_cmd = 'BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>''
WITH (ROWTERMINATOR = ''' + CHAR(10) + ''')';

EXECUTE (@bulk_cmd);

Notes

Sur Windows, \n est automatiquement remplacé par \r\n.

D. Spécifier une page de codes

L’exemple suivant montre comment spécifier une page de codes.

BULK INSERT MyTable
FROM 'D:\data.csv'
WITH (CODEPAGE = '65001', DATAFILETYPE = 'char', FIELDTERMINATOR = ',');

E. Importer des données à partir d'un fichier CSV

L’exemple suivant montre comment spécifier un fichier CSV en ignorant l’en-tête (première ligne), à l’aide de ; comme marque de fin de champ et de 0x0a comme marque de fin de ligne :

BULK INSERT Sales.Invoices
FROM '\\share\invoices\inv-2016-07-25.csv'
WITH (
    FORMAT = 'CSV',
    FIRSTROW = 2,
    FIELDQUOTE = '\',
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = '0x0a'
);

L’exemple suivant montre comment spécifier un fichier CSV au format UTF-8 à l’aide d’un CODEPAGE de 65001 en ignorant l’en-tête (première ligne) à l’aide de ; comme marque de fin de champ et 0x0a comme marque de fin de ligne :

BULK INSERT Sales.Invoices
FROM '\\share\invoices\inv-2016-07-25.csv'
WITH (
    CODEPAGE = '65001',
    FORMAT = 'CSV',
    FIRSTROW = 2,
    FIELDQUOTE = '\',
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = '0x0a'
);

F. Importer des données à partir d’un fichier dans Azure Storage

Charger les données depuis un CSV dans Azure Storage avec le jeton SAS

L’exemple suivant montre comment charger des données à partir d’un fichier CSV dans un emplacement Azure Storage sur lequel vous avez créé une signature d’accès partagé (SAS). L’emplacement Azure Storage est configuré comme une source de données externe, ce qui nécessite une identifiante portée de base de données utilisant une clé SAS chiffrée à l’aide d’un DMK dans la base de données utilisateur.

Notes

Assurez-vous de ne pas avoir d’introduction ? dans le jeton SAS, et que vous avez au moins une permission de lecture sur l’objet à charger srt=o&sp=r, et que la période d’expiration est valide (toutes les dates sont en UTC).

(Optionnel) Un DMK n’est pas nécessaire si un DATABASE SCOPED CREDENTIAL a ne l’est pas, car le blob est configuré pour un accès public (anonyme).

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

(Optionnel) A DATABASE SCOPED CREDENTIAL n’est pas nécessaire car le blob est configuré pour un accès public (anonyme).

N’incluez pas de tête ? dans le jeton SAS. Assurez-vous d’avoir au moins une autorisation de lecture sur l’objet à charger (srt=o&sp=r), et que la période d’expiration est valide (toutes les dates sont en UTC).

CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
     SECRET = '******srt = sco&sp = rwac&se = 2017-02-01T00:55:34Z&st = 2016-12-29T16:55:34Z***************';

Notes

CREDENTIAL n’est pas nécessaire si un blob est configuré pour un accès public (anonyme).

CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'https://****************.blob.core.windows.net/invoices',
    CREDENTIAL = MyAzureBlobStorageCredential
);

BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');

Charger les données depuis un CSV dans Azure Storage avec une identité gérée

L’exemple suivant montre comment utiliser la BULK INSERT commande pour charger des données à partir d’un fichier CSV dans un emplacement Azure Storage en utilisant l’identité managée. Le lieu de stockage Azure est configuré comme une source de données externe.

(Optionnel) Un DMK n’est pas nécessaire si un DATABASE SCOPED CREDENTIAL a ne l’est pas, car le blob est configuré pour un accès public (anonyme).

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

(Optionnel) A DATABASE SCOPED CREDENTIAL n’est pas obligatoire, car le blob est configuré pour un accès public (anonyme) :

CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'Managed Identity';

Accorder le rôle de Storage Blob Data Contributor, afin de fournir un accès en lecture/écriture à l’identité gérée des conteneurs Azure Storage nécessaires.

Notes

CREDENTIAL n’est pas nécessaire si un blob est configuré pour un accès public (anonyme).

CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'https://****************.blob.core.windows.net/invoices',
    CREDENTIAL = MyAzureBlobStorageCredential
);

BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');

Important

L’identité gérée s’applique à SQL Server 2025 (17.x) et versions ultérieures, ainsi qu’à Azure SQL.

G. Importez des données depuis un fichier dans Azure Storage et spécifiez un fichier d’erreur

L’exemple suivant montre comment charger des données à partir d’un fichier CSV dans un emplacement Azure Storage, configuré comme source de données externe, et spécifie également un fichier d’erreur. Vous avez besoin d’informations d’identification délimitées à la base de données à l’aide d’une signature d’accès partagé. Si vous fonctionnez sur Azure SQL Database, l’option ERRORFILE doit être accompagnée de ERRORFILE_DATA_SOURCE, sinon l’importation pourrait échouer avec une erreur de permission. Le fichier spécifié dans ERRORFILE ne doit pas exister dans le conteneur.

BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (
    DATA_SOURCE = 'MyAzureInvoices',
    FORMAT = 'CSV',
    ERRORFILE = 'MyErrorFile',
    ERRORFILE_DATA_SOURCE = 'MyAzureInvoices'
);

Pour des exemples complets BULK INSERT incluant la configuration de la référence et de la source de données externe, voir Exemples d’accès massif aux données dans Azure Storage.

Autres exemples

D’autres exemples de BULK INSERT sont fournis dans les articles suivants :