Delen via


BULK INVOEGEN (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMagazijn in Microsoft Fabric

Hiermee importeert u een gegevensbestand in een databasetabel of weergave in een door de gebruiker opgegeven indeling in SQL Server.

Transact-SQL syntaxisconventies

Syntaxis

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' ]

    ) ]

Argumenten

De instructie BULK INSERT heeft verschillende argumenten en opties op verschillende platforms. De verschillen worden samengevat in de volgende tabel:

Gelaatstrek SQL Server Azure SQL Database en Azure SQL Managed Instance Fabric Data Warehouse
Gegevensbron Lokaal pad, netwerkpad (UNC) of Azure Storage Azure-opslag Azure Storage, One Lake
Bronverificatie Windows-verificatie, SAS Microsoft Entra ID, SAS-token, beheerde identiteit Microsoft Entra-id
Niet-ondersteunde opties * jokers in het pad, FORMAT = 'PARQUET' * jokers in het pad, FORMAT = 'PARQUET' DATAFILETYPE = {'native' | 'widenative'}
Ingeschakelde opties, maar zonder effect KEEPIDENTITY, , FIRE_TRIGGERSCHECK_CONSTRAINTS, TABLOCK, ORDER, , , ROWS_PER_BATCHen KILOBYTES_PER_BATCHBATCHSIZEzijn niet van toepassing. Ze veroorzaken geen syntaxisfout, maar ze hebben geen effect

database_name

De naam van de database waarin de opgegeven tabel of weergave zich bevindt. Als dit niet is opgegeven, is database_name de huidige database.

schema_name

Hiermee geeft u de naam van de tabel of weergaveschema. schema_name is optioneel als het standaardschema voor de gebruiker die de bulkimportbewerking uitvoert, een schema is van de opgegeven tabel of weergave. Als schema niet is opgegeven en het standaardschema van de gebruiker die de bulkimportbewerking uitvoert, verschilt van de opgegeven tabel of weergave, retourneert SQL Server een foutbericht en wordt de bewerking voor bulkimport geannuleerd.

table_name

Hiermee geeft u de naam van de tabel of weergave om gegevens bulksgewijs in te importeren. Alleen weergaven waarin alle kolommen naar dezelfde basistabel verwijzen, kunnen worden gebruikt. Zie INSERT voor meer informatie over de beperkingen voor het laden van gegevens in weergaven.

VANAF 'data_file'

Hiermee geeft u het volledige pad op van het gegevensbestand dat gegevens bevat die moeten worden geïmporteerd in de opgegeven tabel of weergave.

BULK INSERT kan data importeren van een schijf of Azure Storage (inclusief netwerk, floppy disk, harde schijf, enzovoort).

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

data_file moet een geldig pad opgeven van de server waarop SQL Server wordt uitgevoerd. Als data_file een extern bestand is, geeft u de unc-naam (Universal Naming Convention) op. Een UNC-naam heeft het formulier \\SystemName\ShareName\Path\FileName. Bijvoorbeeld:

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 en Fabric Data Warehouse ondersteunen het lezen van data uit URI, maar ze ondersteunen geen on-premises bestandspaden.

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';

Vanaf SQL Server 2017 (14.x) kan de data_file in Azure Storage worden gebruikt. In dat geval moet u ook data_source_name optie opgeven. Zie bijvoorbeeld gegevens importeren uit een bestand in Azure Storage.

Fabric Data Warehouse ondersteunt twee verschillende padstijlen voor het specificeren van bronpaden:

  • 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 ondersteunt * wildcards die elk teken in de URI kunnen matchen, en stelt je in staat een URI-patroon te definiëren voor de bestanden die geïmporteerd moeten worden. Bijvoorbeeld:

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

Notitie

Vervang door <data-lake>.blob.core.windows.net een juiste URL.

DATA_SOURCE

Van toepassing op: SQL Server 2017 (14.x) en latere versies, Azure SQL Database en Warehouse in Microsoft Fabric.

Specificeert een benoemde externe databron die verwijst naar een Azure Storage-rootlocatie voor de bestandsimport.

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

Notitie

Vervang door <data-lake>.blob.core.windows.net een juiste URL.

Zie CREATE EXTERNAL DATA SOURCEvoor meer informatie.

Het bestandspad in de FROM clausule moet een relatief pad zijn, dat wordt toegevoegd aan de wortellocatie die in de externe databron is gedefinieerd.

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 = ',');

Notitie

Voor de eenvoud gebruiken de volgende voorbeelden relatieve paden en vooraf gedefinieerde externe databronnen..

CODEPAGE

Hiermee geeft u de codepagina van de gegevens in het gegevensbestand. CODEPAGE is alleen relevant als de gegevens teken-, varchar- of tekstkolommen bevatten met tekenwaarden groter dan 127 of kleiner dan 32. Zie bijvoorbeeld Een codepagina opgeven.

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 is geen ondersteunde optie in Linux voor SQL Server 2017 (14.x). Voor SQL Server 2019 (15.x) is alleen de 'RAW' optie toegestaan.CODEPAGE

U moet een sorteringsnaam opgeven voor elke kolom in een -indelingsbestand.

CODEPAGE waarde Beschrijving
ACP Kolommen van teken, varcharof tekst gegevenstype worden geconverteerd van de ANSI-/Microsoft Windows-codepagina (ISO 1252) naar de SQL Server-codepagina.
OEM (standaard) Kolommen met teken-, varchar- of tekstgegevenstype worden geconverteerd van de systeemcodepagina OEM naar de SQL Server-codepagina.
RAW Er wordt geen conversie van de ene codepagina naar de andere uitgevoerd. RAW is de snelste optie.
code_page Specifiek codepaginanummer, bijvoorbeeld 850.

Versies vóór SQL Server 2016 (13.x) bieden geen ondersteuning voor codepagina 65001 (UTF-8-codering).
CODEPAGE waarde Beschrijving
ACP Kolommen van teken, varcharof tekst gegevenstype worden geconverteerd van de ANSI-/Microsoft Windows-codepagina (ISO 1252) naar de SQL Server-codepagina.
code_page Specifiek codepaginanummer, bijvoorbeeld 850.

Versies vóór SQL Server 2016 (13.x) bieden geen ondersteuning voor codepagina 65001 (UTF-8-codering).

GEGEVENSBESTANDTYPE

Hiermee geeft u op dat BULK INSERT de importbewerking wordt uitgevoerd met behulp van de opgegeven waarde voor het gegevensbestandstype.

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');

Notitie

Vervang door <data-lake>.blob.core.windows.net een juiste URL.

DATAFILETYPE waarde Alle gegevens die worden weergegeven in
char (standaard) Tekenopmaak.

Voor meer informatie, zie Gebruik het tekenformaat om data te importeren of exporteren.
widechar Unicode-tekens.

Voor meer informatie, zie Gebruik Unicode-tekenformaat om data te importeren of exporteren.
native Systeemeigen gegevenstypen (database). Maak het systeemeigen gegevensbestand door gegevens bulksgewijs te importeren uit SQL Server met behulp van het hulpprogramma bcp.

De systeemeigen waarde biedt een alternatief voor hogere prestaties dan de waarde van het teken. Systeemeigen indeling wordt aanbevolen wanneer u gegevens bulksgewijs overdraagt tussen meerdere exemplaren van SQL Server met behulp van een gegevensbestand dat geen DBCS-tekens (extended/double-byte character set) bevat.

Voor meer informatie, zie Gebruik het native formaat om data te importeren of exporteren.
widenative Systeemeigen gegevenstypen (database) behalve in teken, varcharen tekst kolommen, waarin gegevens worden opgeslagen als Unicode. Maak het widenative gegevensbestand door gegevens bulksgewijs te importeren uit SQL Server met behulp van het bcp-hulpprogramma .

De widenative waarde biedt een alternatief voor betere prestaties.widechar Als het gegevensbestand uitgebreide ANSI-tekens bevat, geeft u op widenative.

Voor meer informatie, zie Gebruik Unicode Native Format om gegevens te importeren of exporteren.
DATAFILETYPE waarde Alle gegevens die worden weergegeven in
char (standaard) Tekenopmaak.

Voor meer informatie, zie Gebruik het tekenformaat om data te importeren of exporteren.
widechar Unicode-tekens.

Voor meer informatie, zie Gebruik Unicode-tekenformaat om data te importeren of exporteren.

MAXERRORS

Hiermee geeft u het maximum aantal syntaxisfouten op dat is toegestaan in de gegevens voordat de bulkimportbewerking wordt geannuleerd. Elke rij die niet kan worden geïmporteerd door de bulkimportbewerking wordt genegeerd en geteld als één fout. Als max_errors niet is opgegeven, is de standaardwaarde 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);

De MAX_ERRORS optie geldt niet voor constraint checks of voor het omzetten van geld en bigint-datatypes .

ERRORFILE

Hiermee geeft u het bestand op dat wordt gebruikt voor het verzamelen van rijen met opmaakfouten en die niet kunnen worden geconverteerd naar een OLE DB-rijenset. Deze rijen worden naar dit foutbestand gekopieerd uit het gegevensbestand 'zoals is'.

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');

Notitie

Vervang door <data-lake>.blob.core.windows.net een juiste URL.

Het foutbestand wordt gemaakt wanneer de opdracht wordt uitgevoerd. Er treedt een fout op als het bestand al bestaat. Daarnaast wordt er een besturingselementbestand met de extensie .ERROR.txt gemaakt, dat verwijst naar elke rij in het foutenbestand en foutdiagnose biedt. Zodra de fouten zijn gecorrigeerd, kunnen de gegevens worden geladen.

Vanaf SQL Server 2017 (14.x) kan de error_file_path in Azure Storage worden gebruikt.

ERRORFILE_DATA_SOURCE

Van toepassing op: SQL Server 2017 (14.x) en latere versies.

Specificeert een benoemde externe databron die wijst naar de Azure Storage-locatie van het foutbestand om fouten die tijdens de import worden gevonden bij te houden.

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'
);

Voor meer details over het aanmaken van externe databronnen, zie EXTERNE DATABRON AANMAKEN.

EERSTE RIJ

Hiermee geeft u het nummer op van de eerste rij die moet worden geladen. De standaardwaarde is de eerste rij in het opgegeven gegevensbestand. FIRSTROW is gebaseerd op 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);

Het FIRSTROW kenmerk is niet bedoeld om kolomkoppen over te slaan. De BULK INSERT instructie biedt geen ondersteuning voor het overslaan van headers. Als u ervoor kiest om rijen over te slaan, kijkt de SQL Server Database Engine alleen naar de veldeindtekens en valideert de gegevens in de velden met overgeslagen rijen niet.

LAATSTE RIJ

Hiermee geeft u het nummer op van de laatste rij die moet worden geladen. De standaardwaarde is 0, wat de laatste rij in het opgegeven gegevensbestand aangeeft.

BATCHGROOTTE

Hiermee geeft u het aantal rijen in een batch op. Elke batch wordt als één transactie naar de server gekopieerd. Als dit mislukt, voert SQL Server de transactie door of rolt u de transactie terug voor elke batch. Standaard is alle gegevens in het opgegeven gegevensbestand één batch. Zie Prestatieoverwegingen verderop in dit artikel voor meer informatie over prestatieoverwegingen.

CONTROLE_BEPERKINGEN

Hiermee geeft u op dat alle beperkingen voor de doeltabel of weergave moeten worden gecontroleerd tijdens de bulkimportbewerking. Zonder de CHECK_CONSTRAINTS optie worden alle CHECKFOREIGN KEY en beperkingen genegeerd en na de bewerking wordt de beperking in de tabel gemarkeerd als niet-vertrouwd.

UNIQUE en PRIMARY KEY beperkingen worden altijd afgedwongen. Wanneer u importeert in een tekenkolom die is gedefinieerd met een NOT NULL beperking, BULK INSERT voegt u een lege tekenreeks in wanneer het tekstbestand geen waarde bevat.

Op een bepaald moment moet u de beperkingen voor de hele tabel onderzoeken. Als de tabel niet leeg was vóór de bulkimportbewerking, kunnen de kosten voor het opnieuwvalideren van de beperking groter zijn dan de kosten voor het toepassen CHECK van beperkingen op de incrementele gegevens.

Een situatie waarin beperkingen zijn uitgeschakeld (het standaardgedrag) is als de invoergegevens rijen bevatten die beperkingen schenden. Als CHECK beperkingen zijn uitgeschakeld, kunt u de gegevens importeren en vervolgens Transact-SQL instructies gebruiken om de ongeldige gegevens te verwijderen.

Notitie

De MAXERRORS optie is niet van toepassing op beperkingscontrole.

VUUR_TRIGGERS

Hiermee geeft u op dat eventuele invoegtriggers die zijn gedefinieerd in de doeltabel worden uitgevoerd tijdens de bulkimportbewerking. Als triggers zijn gedefinieerd voor INSERT bewerkingen in de doeltabel, worden deze geactiveerd voor elke voltooide batch.

Als FIRE_TRIGGERS dit niet is opgegeven, worden er geen invoegtriggers uitgevoerd.

KEEPIDENTITY

Hiermee geeft u op dat de identiteitswaarde of -waarden in het geïmporteerde gegevensbestand moeten worden gebruikt voor de identiteitskolom. Als KEEPIDENTITY dit niet is opgegeven, worden de identiteitswaarden voor deze kolom geverifieerd, maar niet geïmporteerd en wijst SQL Server automatisch unieke waarden toe op basis van de seed- en incrementele waarden die zijn opgegeven tijdens het maken van de tabel. Als het gegevensbestand geen waarden bevat voor de identiteitskolom in de tabel of weergave, gebruikt u een indelingsbestand om op te geven dat de identiteitskolom in de tabel of weergave moet worden overgeslagen bij het importeren van gegevens; SQL Server wijst automatisch unieke waarden toe voor de kolom. Zie DBCC CHECKIDENT-voor meer informatie.

Voor meer informatie, zie over het behouden van identiteitswaarden bij het behouden van identiteitswaarden bij het bulkimporteren van data.

KEEPNULLEN

Hiermee geeft u op dat lege kolommen een null-waarde moeten behouden tijdens de bulkimportbewerking, in plaats van dat er standaardwaarden worden ingevoegd voor de kolommen. Voor meer informatie, zie Behoud nullen of standaardwaarden tijdens bulkimport.

KILOBYTES_PER_BATCH

Hiermee geeft u het geschatte aantal kilobytes (KB) van gegevens per batch op als kilobytes_per_batch. Standaard is KILOBYTES_PER_BATCH onbekend. Zie Prestatieoverwegingen verderop in dit artikel voor meer informatie over prestatieoverwegingen.

ORDER

Hiermee geeft u op hoe de gegevens in het gegevensbestand worden gesorteerd. De prestaties van bulkimport worden verbeterd als de gegevens die worden geïmporteerd, worden gesorteerd op basis van de geclusterde index in de tabel, indien van toepassing. Als het gegevensbestand wordt gesorteerd in een andere volgorde dan de volgorde van een geclusterde indexsleutel of als er geen geclusterde index in de tabel is, wordt de ORDER-component genegeerd. De opgegeven kolomnamen moeten geldige kolomnamen in de doeltabel zijn. Standaard wordt bij de bulksgewijze invoegbewerking ervan uitgegaan dat het gegevensbestand niet is gerangschikt. Voor geoptimaliseerde bulkimport valideert SQL Server ook of de geïmporteerde gegevens zijn gesorteerd.

n is een tijdelijke aanduiding die aangeeft dat meerdere kolommen kunnen worden opgegeven.

ROWS_PER_BATCH

Geeft het geschatte aantal rijen met gegevens in het gegevensbestand aan.

Standaard worden alle gegevens in het gegevensbestand als één transactie naar de server verzonden en is het aantal rijen in de batch onbekend voor de queryoptimalisatie. Als u opgeeft ROWS_PER_BATCH (met een waarde > 0), gebruikt de server deze waarde om de bulkimportbewerking te optimaliseren. De opgegeven ROWS_PER_BATCH waarde moet ongeveer gelijk zijn aan het werkelijke aantal rijen. Zie Prestatieoverwegingen verderop in dit artikel voor meer informatie over prestatieoverwegingen.

TABLOCK

Hiermee geeft u op dat een vergrendeling op tabelniveau wordt verkregen voor de duur van de bulkimportbewerking. Een tabel kan gelijktijdig door meerdere clients worden geladen als de tabel geen indexen heeft en TABLOCK is opgegeven. Standaard wordt het vergrendelingsgedrag bepaald door de tabeloptie tabelvergrendeling bij bulksgewijs laden. Het vasthouden van een vergrendeling voor de duur van de bulkimportbewerking vermindert vergrendelingsconflicten in de tabel, in sommige gevallen kunnen de prestaties aanzienlijk verbeteren. Zie Prestatieoverwegingen verderop in dit artikel voor meer informatie over prestatieoverwegingen.

Voor een columnstore-index is het vergrendelingsgedrag anders omdat deze intern is onderverdeeld in meerdere rijensets. Elke thread laadt gegevens exclusief in elke rijenset door een exclusieve (X)-vergrendeling op de rijenset te nemen, zodat parallelle gegevens worden geladen met gelijktijdige sessies voor het laden van gegevens. Het gebruik van TABLOCK de optie zorgt ervoor dat de thread een exclusieve vergrendeling op de tabel neemt (in tegenstelling tot de bu-vergrendeling (bulkupdate) voor traditionele rijensets), waardoor andere gelijktijdige threads gegevens gelijktijdig laden.

Opties voor invoerbestandsindeling

FORMAT

Van toepassing op: SQL Server 2017 (14.x) en latere versies.

Hiermee geeft u een bestand met door komma's gescheiden waarden dat compatibel is met de RFC 4180 standaard.

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');

In Fabric Data Warehouse ondersteunt de instructie dezelfde formaten als de BULK INSERT instructie, dus COPY INTO wordt deze FORMAT = 'PARQUET' ook ondersteund.

FIELDQUOTE

Van toepassing op: SQL Server 2017 (14.x) en latere versies.

Hiermee geeft u een teken op dat moet worden gebruikt als het aanhalingsteken in het CSV-bestand. Als dit niet is opgegeven, wordt het aanhalingsteken (") gebruikt als het aanhalingsteken, zoals gedefinieerd in de RFC 4180-standaard .

FORMATFILE

Hiermee geeft u het volledige pad van een indelingsbestand. Een indelingsbestand beschrijft het gegevensbestand dat opgeslagen antwoorden bevat die zijn gemaakt met behulp van het bcp hulpprogramma in dezelfde tabel of weergave.

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');

Notitie

Vervang door <data-lake>.blob.core.windows.net een juiste URL.

Het indelingsbestand moet worden gebruikt als:

  • Het gegevensbestand bevat meer of minder kolommen dan de tabel of weergave.
  • De kolommen bevinden zich in een andere volgorde.
  • De kolomscheidingstekens variëren.
  • Er zijn andere wijzigingen in de gegevensindeling. Indelingsbestanden worden doorgaans gemaakt met behulp van het hulpprogramma bcp en indien nodig gewijzigd met een teksteditor. Voor meer informatie, zie bcp Utility en maak een formaat bestand aan met bcp.

Vanaf SQL Server 2017 (14.x), en in Azure SQL Database, format_file_path kan het in Azure Storage zijn.

FORMATFILE_DATA_SOURCE

Van toepassing op: SQL Server 2017 (14.x) en latere versies.

Specificeert een benoemde externe databron die verwijst naar de Azure Storage-locatie van het formaatbestand om het schema van geïmporteerde data te definiëren.

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

Specificeert de veldterminator die gebruikt moet worden voor char en widechar databestanden. Het standaardveldeindteken is \t (tabteken). Zie Veld- en rijeindtekens opgeven voor meer informatie.

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

Specificeert de rijterminator die gebruikt moet worden voor char en widechar databestanden.

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);

De standaard rijterminator is \r\n (carriage return en regelvernieuwing). Zie Veld- en rijeindtekens opgeven voor meer informatie.

Compatibiliteit

BULK INSERT dwingt strikte gegevensvalidatie en gegevenscontroles af van gegevens die worden gelezen uit een bestand dat ervoor kan zorgen dat bestaande scripts mislukken wanneer ze worden uitgevoerd op ongeldige gegevens. Controleert bijvoorbeeld BULK INSERT of:

  • De systeemeigen weergaven van float- of echte gegevenstypen zijn geldig.
  • Unicode-gegevens hebben een even bytelengte.

Gegevenstypen

Conversies van tekenreeks naar decimaal gegevenstype

De conversies van tekenreeks naar decimaal gegevenstype die worden gebruikt volgens BULK INSERT dezelfde regels als de functie Transact-SQL CONVERT , waarmee tekenreeksen worden geweigerd die numerieke waarden vertegenwoordigen die gebruikmaken van wetenschappelijke notatie. BULK INSERT Behandelt dergelijke tekenreeksen daarom als ongeldige waarden en rapporteert conversiefouten.

Als u dit gedrag wilt omzeilen, gebruikt u een indelingsbestand om wetenschappelijke notatie bulksgewijs te importeren gegevens in een decimale kolom te zweven. Beschrijf in het indelingsbestand de kolom expliciet als echte of zwevende gegevens. Zie float en real voor meer informatie over deze gegevenstypen.

Indelingsbestanden vertegenwoordigen echte gegevens als het SQLFLT4 gegevenstype en gegevens laten zweven als het SQLFLT8 gegevenstype. Voor informatie over niet-XML-bestanden zie Specificeer bestandsopslag type met bcp.

Voorbeeld van het importeren van een numerieke waarde die gebruikmaakt van wetenschappelijke notatie

In dit voorbeeld wordt de volgende tabel in de bulktest-database gebruikt:

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

De gebruiker wil gegevens bulksgewijs importeren in de t_float tabel. Het gegevensbestand, C:\t_float-c.datbevat wetenschappelijke notatie floatgegevens , bijvoorbeeld:

8.0000000000000002E-2 8.0000000000000002E-2

Wanneer u dit voorbeeld kopieert, moet u rekening houden met verschillende teksteditors en coderingen waarmee tabtekens (\t) als spaties worden opgeslagen. Verderop in dit voorbeeld wordt een tabteken verwacht.

U BULK INSERT kunt deze gegevens echter niet rechtstreeks importeren in t_float, omdat de tweede kolom het c2decimale gegevenstype gebruikt. Daarom is een indelingsbestand nodig. Het indelingsbestand moet de wetenschappelijke notatie zwevende gegevens toewijzen aan de decimale notatie van kolom c2.

In het volgende indelingsbestand wordt het SQLFLT8 gegevenstype gebruikt om het tweede gegevensveld toe te wijzen aan de tweede kolom:

<?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>

Als u dit indelingsbestand (met de bestandsnaam C:\t_floatformat-c-xml.xml) wilt gebruiken om de testgegevens in de testtabel te importeren, geeft u de volgende Transact-SQL instructie uit:

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

Belangrijk

Azure SQL Database en Fabric Data Warehouse ondersteunen alleen lezen vanuit URI (bijvoorbeeld Azure Storage).

Gegevenstypen voor bulksgewijs exporteren of importeren van SQLXML-documenten

Als u SQLXML-gegevens bulksgewijs wilt exporteren of importeren, gebruikt u een van de volgende gegevenstypen in uw indelingsbestand:

Gegevenstype Gevolg
SQLCHAR- of SQLVARCHAR- De gegevens worden verzonden op de clientcodepagina of op de codepagina die wordt geïmpliceerd door de sortering). Het effect is hetzelfde als het opgeven van de DATAFILETYPE = 'char' zonder een indelingsbestand op te geven.
SQLNCHAR- of SQLNVARCHAR- De gegevens worden verzonden als Unicode. Het effect is hetzelfde als het opgeven van de DATAFILETYPE = 'widechar' zonder een indelingsbestand op te geven.
SQLBINARY- of SQLVARBIN- De gegevens worden zonder conversie verzonden.

Opmerkingen

Voor een vergelijking van de BULK INSERT instructie, de INSERT ... SELECT * FROM OPENROWSET(BULK...) instructie en het commando bcp , zie Bulk Import en Export van Data.

Zie Gegevens voorbereiden voor bulkexport of -import voor informatie over het voorbereiden van gegevens voor bulkimport.

De BULK INSERT instructie kan worden uitgevoerd binnen een door de gebruiker gedefinieerde transactie om gegevens in een tabel of weergave te importeren. Als u meerdere overeenkomsten wilt gebruiken voor het bulksgewijs importeren van gegevens, kan een transactie de BATCHSIZE component in de BULK INSERT instructie opgeven. Als een transactie met meerdere batches wordt teruggedraaid, wordt elke batch die naar SQL Server wordt verzonden, teruggedraaid.

Interoperabiliteit

Gegevens importeren uit een CSV-bestand

Vanaf SQL Server 2017 (14.x) BULK INSERT wordt de CSV-indeling ondersteund, net als Azure SQL Database.

Vóór SQL Server 2017 (14.x) worden csv-bestanden (door komma's gescheiden waarden) niet ondersteund door bulkimportbewerkingen van SQL Server. In sommige gevallen kan een CSV-bestand echter worden gebruikt als het gegevensbestand voor het bulksgewijs importeren van gegevens in SQL Server. Zie Gegevens voorbereiden voor bulkexport of import voor informatie over de vereisten voor het importeren van gegevens uit een CSV-gegevensbestand.

Logboekgedrag

Zie Vereisten voor minimale logboekregistratie bij bulkimport voor informatie over wanneer bewerkingen voor het bulksgewijs importeren in SQL Server worden uitgevoerd. Minimale logboekregistratie wordt niet ondersteund in Azure SQL Database.

Beperkingen

Wanneer u een indelingsbestand gebruikt met BULK INSERT, kunt u maximaal 1024 velden opgeven. Dit is hetzelfde als het maximum aantal kolommen dat is toegestaan in een tabel. Als u een indelingsbestand gebruikt met BULK INSERT een gegevensbestand dat meer dan 1024 velden bevat, BULK INSERT wordt de fout 4822 gegenereerd. Het bcp-hulpprogramma heeft deze beperking niet, dus voor gegevensbestanden die meer dan 1024 velden bevatten, gebruiken BULK INSERT zonder een indelingsbestand of de bcp-opdracht gebruiken.

Prestatieoverwegingen

Als het aantal pagina's dat in één batch moet worden leeggemaakt een interne drempelwaarde overschrijdt, kan er een volledige scan van de buffergroep optreden om te bepalen welke pagina's moeten worden leeggemaakt wanneer de batchdoorvoeringen worden uitgevoerd. Deze volledige scan kan de prestaties van bulkimport schaden. Een waarschijnlijk geval van het overschrijden van de interne drempelwaarde vindt plaats wanneer een grote buffergroep wordt gecombineerd met een traag I/O-subsysteem. Als u bufferoverloop op grote machines wilt voorkomen, gebruikt u de TABLOCK hint (waardoor de bulkoptimalisaties worden verwijderd) niet of gebruikt u een kleinere batchgrootte (waardoor de bulkoptimalisaties behouden blijven).

U moet verschillende batchgrootten testen met uw gegevensbelasting om erachter te komen wat het beste voor u werkt. Houd er rekening mee dat de batchgrootte gedeeltelijke terugdraaibewerkingen heeft. Als uw proces mislukt en voordat u het opnieuw gebruikt BULK INSERT , moet u mogelijk extra handmatig werk doen om een deel van de rijen te verwijderen die zijn ingevoegd, voordat er een fout is opgetreden.

Met Azure SQL Database kunt u het prestatieniveau van de database of het exemplaar tijdelijk verhogen vóór het importeren als u een groot aantal gegevens importeert.

Veiligheid

Delegatie van beveiligingsaccount (imitatie)

Als een gebruiker een SQL Server-aanmelding gebruikt, wordt het beveiligingsprofiel van het SQL Server-procesaccount gebruikt. Een aanmelding met BEHULP van SQL Server-verificatie kan niet worden geverifieerd buiten de database-engine. Wanneer een BULK INSERT opdracht wordt gestart door een aanmelding met behulp van SQL Server-verificatie, wordt de verbinding met de gegevens gemaakt met behulp van de beveiligingscontext van het SQL Server-procesaccount (het account dat wordt gebruikt door de SQL Server Database Engine-service).

Als u de brongegevens wilt lezen, moet u het account dat door de SQL Server Database Engine wordt gebruikt, toegang verlenen tot de brongegevens. Als een SQL Server-gebruiker zich daarentegen aanmeldt met Windows-verificatie, kan de gebruiker alleen de bestanden lezen die toegankelijk zijn voor het gebruikersaccount, ongeacht het beveiligingsprofiel van het SQL Server-proces.

Bij het uitvoeren van de BULK INSERT instructie met behulp van sqlcmd of osql, vanaf één computer, het invoegen van gegevens in SQL Server op een tweede computer en het opgeven van een data_file op een derde computer met behulp van een UNC-pad, krijgt u mogelijk een 4861-fout.

Als u deze fout wilt oplossen, gebruikt u SQL Server-verificatie en geeft u een SQL Server-aanmelding op die gebruikmaakt van het beveiligingsprofiel van het SQL Server-procesaccount of configureert u Windows om delegatie van beveiligingsaccounts in te schakelen. Zie De Help van Windows voor informatie over het inschakelen van een gebruikersaccount dat kan worden vertrouwd voor delegatie.

Zie BULK INSERT voor meer informatie over deze en andere beveiligingsoverwegingen voor het gebruik.

Wanneer je importeert vanuit Azure Storage en de data niet openbaar is (anonieme toegang), maak dan een DATABASE SCOPED CREDENTIAL aan op basis van een SAS-sleutel die is versleuteld met een database master key (DMK), en maak vervolgens een externe databasebron aan voor gebruik in je BULK INSERT commando.

U kunt ook een DATABASE SCOPED CREDENTIAL maken op basis van MANAGED IDENTITY om aanvragen voor gegevenstoegang in niet-openbare opslagaccounts te autoriseren. Bij gebruik van MANAGED IDENTITY, moet Azure Storage rechten verlenen aan de beheerde identiteit van de instantie door de Storage Blob Data Contributor ingebouwde Azure role-based access control (RBAC) rol toe te voegen, die lees-/schrijftoegang biedt voor de beheerde identiteit voor de benodigde Azure Storage containers. Azure SQL Managed Instance heeft een door het systeem toegewezen beheerde identiteit en kan ook een of meer door de gebruiker toegewezen beheerde identiteiten hebben. U kunt door het systeem toegewezen beheerde identiteiten of door de gebruiker toegewezen beheerde identiteiten gebruiken om de aanvragen te autoriseren. Voor autorisatie wordt de default identiteit van het beheerde exemplaar gebruikt (dat wil gezegd de primaire door de gebruiker toegewezen beheerde identiteit of door het systeem toegewezen beheerde identiteit als door de gebruiker toegewezen beheerde identiteit niet is opgegeven). Zie bijvoorbeeld gegevens importeren uit een bestand in Azure Storage.

Belangrijk

Managed Identity is van toepassing op Azure SQL en SQL Server 2025 (17.x) en latere versies.

Machtigingen

De volgende machtigingen zijn van toepassing op de locatie waar de gegevens bulksgewijs worden geïmporteerd (het doel).

Vereist INSERT en ADMINISTER BULK OPERATIONS machtigingen. In Azure SQL Database INSERTADMINISTER DATABASE BULK OPERATIONS zijn machtigingen vereist. ADMINISTER BULK OPERATIONS machtigingen of de rol bulkadmin worden niet ondersteund voor SQL Server in Linux. Alleen de sysadmin- kunnen bulksgewijs invoegen voor SQL Server in Linux.

ALTER TABLE Daarnaast is de machtiging vereist als aan een of meer van de volgende voorwaarden wordt voldaan:

  • Er bestaan beperkingen en de CHECK_CONSTRAINTS optie is niet opgegeven.

    Beperkingen uitschakelen is het standaardgedrag. Als u expliciet beperkingen wilt controleren, gebruikt u de CHECK_CONSTRAINTS optie.

  • Triggers bestaan en de FIRE_TRIGGER optie is niet opgegeven.

    Triggers worden standaard niet geactiveerd. Als u triggers expliciet wilt activeren, gebruikt u de FIRE_TRIGGER optie.

  • U gebruikt de KEEPIDENTITY optie om de identiteitswaarde uit het gegevensbestand te importeren.

Voorbeelden

De codevoorbeelden in dit artikel gebruiken de AdventureWorks2025 of AdventureWorksDW2025 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .

Belangrijk

Azure SQL Database en Fabric Warehouse ondersteunen alleen lezen vanuit Azure Storage.

Een. Pijpen gebruiken om gegevens uit een bestand te importeren

In het volgende voorbeeld wordt orderdetailinformatie geïmporteerd in de AdventureWorks2022.Sales.SalesOrderDetail tabel uit het opgegeven gegevensbestand met behulp van een pijp (|) als het veldeindteken en |\n als het rijeindteken.

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

B. Het argument FIRE_TRIGGERS gebruiken

In het volgende voorbeeld wordt het argument FIRE_TRIGGERS opgegeven.

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

C. Regelinvoer gebruiken als een rijeindteken

In het volgende voorbeeld wordt een bestand geïmporteerd dat gebruikmaakt van de regelfeed als een rijeindteken zoals een UNIX-uitvoer:

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);

Notitie

In Windows \n wordt automatisch vervangen door \r\n.

D. Een codepagina opgeven

In het volgende voorbeeld ziet u hoe u een codepagina opgeeft.

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

E. Gegevens importeren uit een CSV-bestand

In het volgende voorbeeld ziet u hoe u een CSV-bestand opgeeft, de koptekst (eerste rij) overslaat met behulp van ; als veldeindteken en 0x0a als regeleindteken:

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

In het volgende voorbeeld ziet u hoe u een CSV-bestand opgeeft in UTF-8-indeling (met behulp van een CODEPAGE van 65001), de koptekst (eerste rij) overslaat, met behulp van ; als veldeindteken en 0x0a als regeleindteken:

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

F. Import data uit een bestand in Azure Storage

Laad data uit een CSV in Azure Storage met SAS-token

Het volgende voorbeeld laat zien hoe je gegevens kunt laden uit een CSV-bestand in een Azure Storage-locatie waarop je een Shared Access Signature (SAS) hebt aangemaakt. De Azure Storage-locatie is geconfigureerd als een externe databron, wat een databasescoped credential vereist met een SAS-sleutel die is versleuteld met een DMK in de gebruikersdatabase.

Notitie

Zorg ervoor dat je geen lead ? hebt in het SAS-token, en dat je ten minste leestoestemming hebt op het object dat geladen srt=o&sp=rmoet worden, en dat die vervaldatum geldig is (alle data zijn in UTC-tijd).

(Optioneel) Een DMK is niet vereist als een DATABASE SCOPED CREDENTIAL dat niet nodig is, omdat de blob is geconfigureerd voor publieke (anonieme) toegang.

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

(Optioneel) A DATABASE SCOPED CREDENTIAL is niet vereist omdat de blob is geconfigureerd voor publieke (anonieme) toegang.

Voeg geen lead ? toe in de SAS-token. Zorg ervoor dat je ten minste leesrechten hebt op het object dat geladen moet worden (srt=o&sp=r), en dat de vervaldatum geldig is (alle data vallen in UTC-tijd).

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***************';

Notitie

CREDENTIAL is niet vereist als een blob is geconfigureerd voor publieke (anonieme) toegang.

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');

Laad data uit een CSV in Azure Storage met een beheerde identiteit

Het volgende voorbeeld laat zien hoe je het BULK INSERT commando gebruikt om gegevens te laden uit een CSV-bestand in een Azure Storage-locatie met behulp van Managed Identity. De Azure Storage-locatie is geconfigureerd als een externe databron.

(Optioneel) Een DMK is niet vereist als een DATABASE SCOPED CREDENTIAL dat niet nodig is, omdat de blob is geconfigureerd voor publieke (anonieme) toegang.

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

(Optioneel) A DATABASE SCOPED CREDENTIAL is niet vereist, omdat de blob is geconfigureerd voor publieke (anonieme) toegang:

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

Verleen de rol Storage Blob Data Contributor om lees-/schrijftoegang te bieden voor de beheerde identiteit voor de benodigde Azure Storage containers.

Notitie

CREDENTIAL is niet vereist als een blob is geconfigureerd voor publieke (anonieme) toegang.

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');

Belangrijk

Managed identity is van toepassing op SQL Server 2025 (17.x) en latere versies, en Azure SQL.

G. Importeer gegevens uit een bestand in Azure Storage en specificeer een foutbestand

Het volgende voorbeeld laat zien hoe gegevens uit een CSV-bestand geladen kunnen worden in een Azure Storage-locatie, die is geconfigureerd als externe databron, en ook een foutbestand specificeert. U hebt een databasereferentie met een shared access Signature nodig. Als je op Azure SQL Database draait, ERRORFILE moet de optie gepaard gaan met ERRORFILE_DATA_SOURCE, anders kan de import mislukken met een permissiefout. Het bestand waarin is opgegeven ERRORFILE , mag niet aanwezig zijn in de container.

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

Voor volledige BULK INSERT voorbeelden, waaronder het configureren van de credential en externe databron, zie Voorbeelden van bulktoegang tot data in Azure Storage.

Meer voorbeelden

Andere BULK INSERT voorbeelden worden gegeven in de volgende artikelen: