BULK INSERT (Transact-SQL)
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
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' | 'native' | 'widechar' | '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 ]
)]
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 Storage | Azure Storage |
Bronverificatie | Windows-verificatie, SAS | Microsoft Entra ID, SAS-token, beheerde identiteit | Microsoft Entra-id |
Niet-ondersteunde opties |
* jokertekens in pad |
* jokertekens in pad |
DATA_SOURCE , FORMATFILE_DATA_SOURCE , ERRORFILE , ERRORFILE_DATA_SOURCE |
Ingeschakelde opties, maar zonder effect |
KEEPIDENTITY , FIRE_TRIGGERS , CHECK_CONSTRAINTS , TABLOCK , ORDER , ROWS_PER_BATCH , KILOBYTES_PER_BATCH en BATCHSIZE zijn niet van toepassing. Ze veroorzaken geen syntaxisfout, maar ze hebben geen effect |
Notitie
De INSTRUCTIE BULK INSERT bevindt zich in preview in Fabric Data Warehouse.
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 (Transact-SQL)voor meer informatie over de beperkingen voor het laden van gegevens in weergaven.
FROM '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 gegevens importeren uit een schijf of Azure Blob Storage (inclusief netwerk, diskette, 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 Warehouse ondersteunen alleen lezen vanuit Azure Blob Storage.
Vanaf SQL Server 2017 (14.x) kan de data_file zich in Azure Blob Storage bevinden. In dat geval moet u ook data_source_name
optie opgeven. Zie bijvoorbeeld Gegevens importeren uit een bestand in Azure Blob Storage.
Fabric Warehouse ondersteunt twee verschillende padstijlen voor het opgeven van het bronpad:
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 Warehouse ondersteunt *
jokertekens die overeenkomen met elk teken in de URI en waarmee u een URI-patroon kunt definiëren voor de bestanden die moeten worden geïmporteerd. Bijvoorbeeld:
BULK INSERT bing_covid_19_data
FROM 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/*.csv';
BATCHSIZE = batch_size
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.
CHECK_CONSTRAINTS
Hiermee geeft u op dat alle beperkingen voor de doeltabel of weergave moeten worden gecontroleerd tijdens de bulkimportbewerking. Zonder de optie CHECK_CONSTRAINTS worden eventuele beperkingen VOOR CHECK en FOREIGN KEY genegeerd. Na de bewerking wordt de beperking in de tabel gemarkeerd als niet-vertrouwd.
BEPERKINGEN VOOR UNIEKE EN PRIMAIRE SLEUTELS worden altijd afgedwongen. Wanneer u importeert in een tekenkolom die is gedefinieerd met een NOT NULL-beperking, voegt BULK INSERT 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 van CHECK-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 optie MAXERRORS is niet van toepassing op beperkingscontrole.
CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' }
Hiermee geeft u de codepagina van de gegevens in het gegevensbestand. CODEPAGE is alleen relevant als de gegevens tekens bevatten, varcharof tekst kolommen met tekenwaarden die groter zijn dan 127 of kleiner dan 32. Zie bijvoorbeeld Een codepagina opgeven.
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 voor CODEPAGE.
U moet een sorteringsnaam opgeven voor elke kolom in een -indelingsbestand.
CODEPAGE-waarde | Beschrijving |
---|---|
ACS | Kolommen van teken, varcharof tekst gegevenstype worden geconverteerd van de ANSI-/Microsoft Windows-codepagina (ISO 1252) naar de SQL Server-codepagina. |
OEM (standaard) | Kolommen van teken, varcharof tekst gegevenstype worden geconverteerd van de oem-codepagina van het systeem naar de SQL Server-codepagina. |
RAUW | 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). |
DATAFILETYPE = { 'char' | 'native' | "widechar" | 'widenative' }
Hiermee geeft u op dat BULK INSERT de importbewerking uitvoert met behulp van de opgegeven waarde voor het gegevensbestandstype.
DATAFILETYPE-waarde | Alle gegevens die worden weergegeven in: |
---|---|
teken (standaard) | Tekenopmaak. Zie Tekenindeling gebruiken voor het importeren of exporteren van gegevens (SQL Server)voor meer informatie. |
systeemeigen | 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. Zie Systeemeigen indeling gebruiken voor het importeren of exporteren van gegevens (SQL Server)voor meer informatie. |
widechar- | Unicode-tekens. Zie Unicode-tekenindeling gebruiken voor het importeren of exporteren van gegevens (SQL Server)voor meer informatie. |
brede | Systeemeigen gegevenstypen (database) behalve in teken, varcharen tekst kolommen, waarin gegevens worden opgeslagen als Unicode. Maak het widenative-gegevensbestand door gegevens bulksgewijs uit SQL Server te importeren met behulp van het hulpprogramma bcp. De brede waarde biedt een alternatief voor betere prestaties voor widechar-. Als het gegevensbestand uitgebreide ANSI-tekens bevat, geeft u bredeop. Zie Unicode Native Format gebruiken voor het importeren of exporteren van gegevens (SQL Server)voor meer informatie. |
DATA_SOURCE = 'data_source_name'
van toepassing op: SQL Server 2017 (14.x) en Azure SQL Database.
Hiermee geeft u een benoemde externe gegevensbron die verwijst naar de Azure Blob Storage-locatie van het bestand dat wordt geïmporteerd. De externe gegevensbron moet worden gemaakt met behulp van de optie TYPE = BLOB_STORAGE
toegevoegd in SQL Server 2017 (14.x). Zie CREATE EXTERNAL DATA SOURCEvoor meer informatie. Zie bijvoorbeeld Gegevens importeren uit een bestand in Azure Blob Storage.
CREATE EXTERNAL DATA SOURCE pandemicdatalake
WITH (LOCATION='https://pandemicdatalake.blob.core.windows.net/public/',TYPE=BLOB_STORAGE)
GO
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 = ',');
ERRORFILE = 'error_file_path'
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'.
Het foutbestand wordt gemaakt wanneer de opdracht wordt uitgevoerd. Er treedt een fout op als het bestand al bestaat. Daarnaast wordt 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 zich in Azure Blob Storage bevinden.
ERRORFILE_DATA_SOURCE = 'errorfile_data_source_name'
Van toepassing op: SQL Server 2017 (14.x).
Hiermee geeft u een benoemde externe gegevensbron die verwijst naar de Azure Blob Storage-locatie van het foutenbestand dat fouten bevat die tijdens het importeren zijn gevonden. De externe gegevensbron moet worden gemaakt met behulp van de optie TYPE = BLOB_STORAGE
toegevoegd in SQL Server 2017 (14.x). Zie CREATE EXTERNAL DATA SOURCEvoor meer informatie.
FIRSTROW = first_row
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.
Het KENMERK FIRSTROW is niet bedoeld om kolomkoppen over te slaan. Het overslaan van headers wordt niet ondersteund door de instructie BULK INSERT. 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.
FIRE_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 niet is opgegeven, worden er geen invoegtriggers uitgevoerd.
FORMATFILE_DATA_SOURCE = 'data_source_name'
Van toepassing op: SQL Server 2017 (14.x).
Hiermee geeft u een benoemde externe gegevensbron die verwijst naar de Azure Blob Storage-locatie van het indelingsbestand dat het schema van geïmporteerde gegevens definieert. De externe gegevensbron moet worden gemaakt met behulp van de optie TYPE = BLOB_STORAGE
toegevoegd in SQL Server 2017 (14.x). Zie CREATE EXTERNAL DATA SOURCEvoor meer informatie.
KEEPIDENTITY
Hiermee geeft u op dat de identiteitswaarde of -waarden in het geïmporteerde gegevensbestand moeten worden gebruikt voor de identiteitskolom. Als KEEPIDENTITY 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 (Transact-SQL)voor meer informatie.
Zie Identiteitswaarden behouden bij bulksgewijs importeren van gegevens (SQL Server)voor meer informatie.
KEEPNULLS
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. Zie Null-waarden behouden of Standaardwaarden gebruiken tijdens bulkimport (SQL Server)voor meer informatie.
KILOBYTES_PER_BATCH = 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.
LASTROW = last_row
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.
MAXERRORS = max_errors
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.
De optie MAX_ERRORS is niet van toepassing op beperkingscontroles of het converteren van geld en bigint gegevenstypen.
ORDER ( { kolom [ ASC | DESC ] } [ ,... n ] )
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 = 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 ROWS_PER_BATCH (met een waarde > 0) opgeeft, gebruikt de server deze waarde om de bulkimportbewerking te optimaliseren. De opgegeven waarde voor ROWS_PER_BATCH moet ongeveer hetzelfde zijn als 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 X-vergrendeling op de rijenset te nemen, zodat parallelle gegevens worden geladen met gelijktijdige sessies voor het laden van gegevens. Het gebruik van de tablock-optie zorgt ervoor dat thread een X-vergrendeling op de tabel neemt (in tegenstelling tot BU-vergrendeling voor traditionele rijensets), waardoor andere gelijktijdige threads gegevens gelijktijdig laden.
Opties voor invoerbestandsindeling
FORMAT = 'CSV'
Van toepassing op: SQL Server 2017 (14.x).
Hiermee geeft u een bestand met door komma's gescheiden waarden dat compatibel is met de RFC 4180 standaard.
BULK INSERT Sales.Orders
FROM '\\SystemX\DiskZ\Sales\data\orders.csv'
WITH ( FORMAT = 'CSV');
FIELDQUOTE = 'field_quote'
Van toepassing op: SQL Server 2017 (14.x).
Hiermee geeft u een teken op dat wordt gebruikt als het aanhalingsteken in het CSV-bestand. Indien niet opgegeven, wordt het aanhalingsteken (") gebruikt als het aanhalingsteken zoals gedefinieerd in de RFC 4180 standaard.
FORMATFILE = 'format_file_path'
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. 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. Zie bcp Utility en Een indelingsbestand makenvoor meer informatie.
Vanaf SQL Server 2017 (14.x) en in Azure SQL Database kan format_file_path
zich in Azure Blob Storage bevinden.
FIELDTERMINATOR = 'field_terminator'
Hiermee geeft u het veldeindteken dat moet worden gebruikt voor teken en widechar gegevensbestanden. Het standaardveldeindteken is \t
(tabteken). Zie Veld- en rijeindtekens (SQL Server) opgevenvoor meer informatie.
ROWTERMINATOR = 'row_terminator'
Hiermee geeft u het rijeindteken dat moet worden gebruikt voor teken en widechar gegevensbestanden. Het standaardrijeindteken is \r\n
(nieuwlijnteken). Zie Veld- en rijeindtekens (SQL Server) opgevenvoor meer informatie.
Compatibiliteit
BULK INSERT dwingt strikte gegevensvalidatie en gegevenscontroles af van gegevens die worden gelezen uit een bestand waardoor bestaande scripts kunnen mislukken wanneer ze worden uitgevoerd op ongeldige gegevens. Bulk INSERT controleert bijvoorbeeld 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 het gegevenstype tekenreeks naar decimaal die worden gebruikt in BULK INSERT, volgen dezelfde regels als de functie Transact-SQL CONVERTEREN, waarmee tekenreeksen worden geweigerd die numerieke waarden vertegenwoordigen die gebruikmaken van wetenschappelijke notatie. Daarom behandelt BULK INSERT dergelijke tekenreeksen 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 and real (Transact-SQL)voor meer informatie over deze gegevenstypen.
Indelingsbestanden vertegenwoordigen echte gegevens als het SQLFLT4 gegevenstype en gegevens laten zweven als het SQLFLT8 gegevenstype. Zie File Storage-type opgeven met bcp (SQL Server)voor meer informatie over bestanden die geen XML-indeling zijn.
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.dat bevat wetenschappelijke notatie zwevende gegevens; 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.
BULK INSERT kan deze gegevens echter niet rechtstreeks importeren in t_float
, omdat de tweede kolom, c2
, gebruikmaakt van het decimal
gegevenstype. 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 biedt alleen ondersteuning voor lezen vanuit Azure Blob 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 | Effect |
---|---|
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 het 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
Zie voor een vergelijking van de instructie BULK INSERT, de INSERT ... SELECT * FROM OPENROWSET(BULK...)
-instructie en de opdracht bcp
Bulkimport en Export van gegevens.
Zie Gegevens voorbereiden voor bulkexport of importvoor informatie over het voorbereiden van gegevens voor bulkimport.
De INSTRUCTIE BULK INSERT 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 opgeven in de INSTRUCTIE BULK INSERT. Als een transactie met meerdere batches wordt teruggedraaid, wordt elke batch die de transactie naar SQL Server heeft verzonden, teruggedraaid.
Interoperabiliteit
Gegevens importeren uit een CSV-bestand
Vanaf SQL Server 2017 (14.x) ondersteunt BULK INSERT de CSV-indeling, 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 importbewerkingen (SQL Server)voor informatie over de vereisten voor het importeren van gegevens uit een CSV-gegevensbestand.
Logboekgedrag
Zie Vereisten voor minimale logboekregistratie in bulkimportvoor informatie over wanneer bewerkingen voor het invoegen van rijen die worden uitgevoerd door bulkimport in SQL Server, worden vastgelegd in het transactielogboek. 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 met een gegevensbestand dat meer dan 1024 velden bevat, genereert BULK INSERT de fout 4822. De bcp-hulpprogramma heeft deze beperking niet, dus voor gegevensbestanden die meer dan 1024 velden bevatten, gebruikt u BULK INSERT zonder een indelingsbestand of gebruikt u de opdracht bcp.
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 bufferoverschrijdingen op grote machines wilt voorkomen, gebruikt u de TABLOCK-hint (waarmee de bulkoptimalisaties worden verwijderd) 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 BULK INSERT opnieuw gebruikt, 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 voordat u importeert tijdelijk verhogen als u een grote hoeveelheid 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 instructie BULK INSERT met behulp van sqlcmd of osql, van de ene 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, kan er een 4861-fout optreden.
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 voor meer informatie over deze en andere beveiligingsoverwegingen voor het gebruik van BULK INSERT Bulkgegevens importeren met BULK INSERT of OPENROWSET(BULK...) (SQL Server).
Wanneer u importeert vanuit Azure Blob Storage en de gegevens niet openbaar zijn (anonieme toegang), maakt u een DATABASE SCOPED CREDENTIAL op basis van een SAS-sleutel die is versleuteld met een MASTER KEYen maakt u vervolgens een externe databasebron voor gebruik in de opdracht BULK INSERT.
U kunt ook een DATABASE SCOPED CREDENTIAL maken op basis van MANAGED IDENTITY
om aanvragen voor gegevenstoegang in niet-openbare opslagaccounts te autoriseren. Wanneer u MANAGED IDENTITY
gebruikt, moet Azure Storage machtigingen verlenen aan de beheerde identiteit van het exemplaar door de inzender voor opslagblobgegevens toe te voegen ingebouwde RBAC-rol (op rollen gebaseerd toegangsbeheer) van Azure die lees-/schrijftoegang biedt tot de beheerde identiteit voor de benodigde Azure Blob 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 is 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 Blob Storage.
Belangrijk
Beheerde identiteit is alleen van toepassing op Azure SQL. SQL Server biedt geen ondersteuning voor managed identity.
Machtigingen
Hiervoor zijn INSERT- en BEHEERMACHTIGINGEN VOOR BULKBEWERKINGen vereist. In Azure SQL Database zijn MACHTIGINGEN VOOR INSERT en ADMINISTER DATABASE BULK OPERATIONS vereist. BEHEER BULKBEWERKINGsmachtigingen of de bulkadmin rol wordt niet ondersteund voor SQL Server op Linux. Alleen de sysadmin- kunnen bulksgewijs invoegen voor SQL Server in Linux.
Daarnaast is de machtiging ALTER TABLE vereist als aan een of meer van de volgende voorwaarden wordt voldaan:
Er bestaan beperkingen en de optie CHECK_CONSTRAINTS is niet opgegeven.
Beperkingen uitschakelen is het standaardgedrag. Als u expliciet beperkingen wilt controleren, gebruikt u de optie CHECK_CONSTRAINTS.
Triggers bestaan en de FIRE_TRIGGER optie is niet opgegeven.
Triggers worden standaard niet geactiveerd. Als u triggers expliciet wilt activeren, gebruikt u de optie FIRE_TRIGGER.
U gebruikt de optie KEEPIDENTITY om de identiteitswaarde uit het gegevensbestand te importeren.
Voorbeelden
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'
);
Belangrijk
Azure SQL Database biedt alleen ondersteuning voor lezen vanuit Azure Blob Storage.
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
);
Belangrijk
Azure SQL Database biedt alleen ondersteuning voor lezen vanuit Azure Blob Storage.
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 VARCHAR(1000);
SET @bulk_cmd = 'BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>''
WITH (ROWTERMINATOR = '''+CHAR(10)+''')';
EXEC(@bulk_cmd);
Notitie
Vanwege de manier waarop Microsoft Windows tekstbestanden behandelt, wordt \n
automatisch vervangen door \r\n
.
Belangrijk
Azure SQL Database biedt alleen ondersteuning voor lezen vanuit Azure Blob Storage.
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 = ','
);
Belangrijk
Azure SQL Database biedt alleen ondersteuning voor lezen vanuit Azure Blob Storage.
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');
Belangrijk
Azure SQL Database biedt alleen ondersteuning voor lezen vanuit Azure Blob Storage.
F. Gegevens importeren uit een bestand in Azure Blob Storage
In het volgende voorbeeld ziet u hoe u gegevens uit een CSV-bestand laadt op een Azure Blob Storage-locatie waarop u een Shared Access Signature (SAS) hebt gemaakt. De Azure Blob Storage-locatie is geconfigureerd als een externe gegevensbron. Hiervoor is een databasereferentie vereist met behulp van een SAS-sleutel die is versleuteld met behulp van een hoofdsleutel in de gebruikersdatabase.
--> Optional - a MASTER KEY is not required if a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'YourStrongPassword1';
GO
--> Optional - a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
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***************';
-- NOTE: Make sure that you don't have a leading ? in SAS token, and
-- that you have at least read permission on the object that should be loaded srt=o&sp=r, and
-- that expiration period is valid (all dates are in UTC time)
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH ( TYPE = BLOB_STORAGE,
LOCATION = 'https://****************.blob.core.windows.net/invoices'
, CREDENTIAL = MyAzureBlobStorageCredential --> CREDENTIAL is not required if a blob is configured for public (anonymous) access!
);
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');
In het volgende voorbeeld ziet u hoe u de opdracht BULK INSERT gebruikt om gegevens uit een CSV-bestand in een Azure Blob Storage-locatie te laden met behulp van beheerde identiteit. De Azure Blob Storage-locatie is geconfigureerd als een externe gegevensbron.
--> Optional - a MASTER KEY is not required if a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'YourStrongPassword1';
GO
--> Optional - a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'Managed Identity';
-- NOTE: Make sure you have granted Storage Bob Data Contributor RBAC on storage to provides read/write access to the managed identity for the necessary Azure Blob Storage containers.
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH ( TYPE = BLOB_STORAGE,
LOCATION = 'https://****************.blob.core.windows.net/invoices'
, CREDENTIAL= MyAzureBlobStorageCredential --> CREDENTIAL is not required if a blob is configured for public (anonymous) access!
);
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');
Belangrijk
Beheerde identiteit is alleen van toepassing op Azure SQL. SQL Server biedt geen ondersteuning voor managed identity.
Belangrijk
Azure SQL biedt alleen ondersteuning voor lezen vanuit Azure Blob Storage.
G. Gegevens importeren uit een bestand in Azure Blob Storage en een foutenbestand opgeven
In het volgende voorbeeld ziet u hoe u gegevens uit een CSV-bestand laadt op een Azure Blob Storage-locatie, die is geconfigureerd als een externe gegevensbron en ook een foutenbestand opgeeft. U hebt een databasereferentie binnen het bereik nodig met behulp van een handtekening voor gedeelde toegang. Als deze wordt uitgevoerd in Azure SQL Database, moet de optie ERRORFILE vergezeld gaan van ERRORFILE_DATA_SOURCE anders kan het importeren mislukken met een machtigingsfout. Het bestand dat is opgegeven in 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');
Zie Voorbeelden van bulktoegang tot gegevens in Azure Blob Storagevoor volledige BULK INSERT
voorbeelden, waaronder het configureren van de referentie en externe gegevensbron.
Meer voorbeelden
Andere BULK INSERT
voorbeelden worden gegeven in de volgende artikelen:
- Voorbeelden van bulksgewijs importeren en exporteren van XML-documenten (SQL Server)
- identiteitswaarden behouden bij het bulksgewijs importeren van gegevens (SQL Server)
- Null-waarden behouden of standaardwaarden gebruiken tijdens het bulksgewijs importeren (SQL Server)
- Veld- en rijeindtekens (SQL Server) opgeven
- een indelingsbestand gebruiken om gegevens bulksgewijs te importeren (SQL Server)
- Tekenindeling gebruiken voor het importeren of exporteren van gegevens (SQL Server)
- Systeemeigen indeling gebruiken voor het importeren of exporteren van gegevens (SQL Server)
- Unicode-tekenindeling gebruiken voor het importeren of exporteren van gegevens (SQL Server)
- Unicode Native Format gebruiken voor het importeren of exporteren van gegevens (SQL Server)
- Een indelingsbestand gebruiken om een tabelkolom (SQL Server) over te slaan
- Een indelingsbestand gebruiken om tabelkolommen toe te wijzen aan Data-File velden (SQL Server)
Zie ook
- bulksgewijs importeren en exporteren van gegevens (SQL Server)
- bcp Utility
- bestanden opmaken voor het importeren of exporteren van gegevens (SQL Server)
- INSERT (Transact-SQL)
- OPENROWSET (Transact-SQL)
- Gegevens voorbereiden voor bulksgewijs exporteren of importeren (SQL Server)
- sp_tableoption (Transact-SQL)