BULK INSATS (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceLager i Microsoft Fabric

Importerar en datafil till en databastabell eller vy i ett användarangivet format i SQL Server.

Transact-SQL syntaxkonventioner

Syntax

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

    ) ]

Argument

Instruktionen BULK INSERT har olika argument och alternativ på olika plattformar. Skillnaderna sammanfattas i följande tabell:

Drag SQL Server Azure SQL Database och Azure SQL Managed Instance Infrastrukturdatalager
Datakälla Lokal sökväg, nätverkssökväg (UNC) eller Azure Storage Azure Storage Azure Storage, One Lake
Källautentisering Windows-autentisering, SAS Microsoft Entra-ID, SAS-token, hanterad identitet Microsoft Entra-ID
Alternativ som inte stöds * jokrar i vägen, FORMAT = 'PARQUET' * jokrar i vägen, FORMAT = 'PARQUET' DATAFILETYPE = {'native' | 'widenative'}
Aktiverade alternativ men utan effekt KEEPIDENTITY, FIRE_TRIGGERS, CHECK_CONSTRAINTS, TABLOCK, ORDER, ROWS_PER_BATCH, KILOBYTES_PER_BATCHoch BATCHSIZE är inte tillämpliga. De utlöser inget syntaxfel, men de har ingen effekt

database_name

Databasnamnet där den angivna tabellen eller vyn finns. Om det inte anges är database_name den aktuella databasen.

schema_name

Anger namnet på tabellen eller visningsschemat. schema_name är valfritt om standardschemat för användaren som utför massimportåtgärden är schemat för den angivna tabellen eller vyn. Om schema inte har angetts och standardschemat för användaren som utför massimportåtgärden skiljer sig från den angivna tabellen eller vyn returnerar SQL Server ett felmeddelande och massimportåtgärden avbryts.

table_name

Anger namnet på tabellen eller vyn som massimportera data till. Endast vyer där alla kolumner refererar till samma bastabell kan användas. Mer information om begränsningarna för att läsa in data i vyer finns i INSERT.

FRÅN "data_file"

Anger den fullständiga sökvägen till den datafil som innehåller data som ska importeras till den angivna tabellen eller vyn.

BULK INSERT kan importera data från en disk eller Azure-lagring (inklusive nätverk, disket, hårddisk och så vidare).

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

data_file måste ange en giltig sökväg från servern där SQL Server körs. Om data_file är en fjärrfil anger du UNC-namnet (Universal Naming Convention). Ett UNC-namn har formuläret \\SystemName\ShareName\Path\FileName. Till exempel:

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 och Fabric Data Warehouse stödjer läsning av data från URI, men de stöder inte lokala filvägar.

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

Från och med SQL Server 2017 (14.x) kan data_file ligga i Azure Storage. I så fall måste du också ange data_source_name alternativ. För ett exempel, se Importera data från en fil i Azure Storage.

Fabric Data Warehouse stödjer två olika vägstilar för att specificera källväg:

  • 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 stöder * jokrar som kan matcha vilket tecken som helst i URI:n och gör det möjligt att definiera ett URI-mönster för filerna som ska importeras. Till exempel:

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

Not

Ersätt <data-lake>.blob.core.windows.net med en lämplig URL.

DATAKÄLLA

Gäller för: SQL Server 2017 (14.x) och senare versioner, Azure SQL Database och Warehouse i Microsoft Fabric.

Specificerar en namngiven extern datakälla som pekar på en Azure Storage-rotplats för filimporten.

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

Not

Ersätt <data-lake>.blob.core.windows.net med en lämplig URL.

Mer information finns i CREATE EXTERNAL DATA SOURCE.

Filvägen i klausulen FROM måste vara en relativ sökväg, som kommer att läggas till rotplatsen som definieras i den externa datakällan.

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

Not

För enkelhetens skull använder följande exempel relativa vägar och fördefinierade externa datakällor..

KODSIDA

Anger kodsidan för data i datafilen. CODEPAGE är endast relevant om data innehåller tecken-, varchar- eller textkolumner med teckenvärden som är större än 127 eller mindre än 32. Ett exempel finns i Ange en kodsida.

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 är inte ett alternativ som stöds i Linux för SQL Server 2017 (14.x). För SQL Server 2019 (15.x) tillåts endast 'RAW' alternativet för CODEPAGE.

Du bör ange ett sorteringsnamn för varje kolumn i en formatfil.

CODEPAGE värde Beskrivning
ACP Kolumner med tecken, varchareller text datatyp konverteras från kodsidan ANSI/Microsoft Windows (ISO 1252) till SQL Server-kodsidan.
OEM (standardinställning) Kolumner med tecken-, varchar- eller textdatatyp konverteras från systemkodsidan OEM till SQL Server-kodsidan.
RAW Ingen konvertering från en kodsida till en annan sker. RAW är det snabbaste alternativet.
code_page Specifikt kodsidenummer, till exempel 850.

Versioner före SQL Server 2016 (13.x) stöder inte kodsida 65001 (UTF-8-kodning).
CODEPAGE värde Beskrivning
ACP Kolumner med tecken, varchareller text datatyp konverteras från kodsidan ANSI/Microsoft Windows (ISO 1252) till SQL Server-kodsidan.
code_page Specifikt kodsidenummer, till exempel 850.

Versioner före SQL Server 2016 (13.x) stöder inte kodsida 65001 (UTF-8-kodning).

DATAFILETYPE

Anger som BULK INSERT utför importåtgärden med det angivna värdet för datafilstyp.

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

Not

Ersätt <data-lake>.blob.core.windows.net med en lämplig URL.

DATAFILETYPE värde Alla data som representeras i
char (standardinställning) Teckenformat.

För mer information, se Använd teckenformat för att importera eller exportera data.
widechar Unicode-tecken.

För mer information, se Använd Unicode-teckenformat för att importera eller exportera data.
native Interna datatyper (databas). Skapa den interna datafilen genom att massimportera data från SQL Server med hjälp av verktyget bcp.

Det interna värdet erbjuder ett alternativ med högre prestanda till teckenvärdet. Internt format rekommenderas när du massöverföring av data mellan flera instanser av SQL Server med hjälp av en datafil som inte innehåller några dbcs-tecken (extended/double-byte character set).

För mer information, se Använd native-format för att importera eller exportera data.
widenative Interna datatyper (databas), förutom i tecken, varcharoch text kolumner, där data lagras som Unicode. widenative Skapa datafilen genom att massimportera data från SQL Server med hjälp av bcp-verktyget.

Värdet widenative erbjuder ett alternativ med högre prestanda till widechar. Om datafilen innehåller ANSI-utökade tecken anger du widenative.

För mer information, se Använd Unicode Native Format för att importera eller exportera data.
DATAFILETYPE värde Alla data som representeras i
char (standardinställning) Teckenformat.

För mer information, se Använd teckenformat för att importera eller exportera data.
widechar Unicode-tecken.

För mer information, se Använd Unicode-teckenformat för att importera eller exportera data.

MAXERRORS

Anger det maximala antalet syntaxfel som tillåts i data innan massimporten avbryts. Varje rad som inte kan importeras av massimportåtgärden ignoreras och räknas som ett fel. Om max_errors inte anges är standardvärdet 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);

Alternativet MAX_ERRORS gäller inte för begränsningskontroller eller för att konvertera pengar och bigint-datatyper .

FELFIL

Anger den fil som används för att samla in rader som har formateringsfel och som inte kan konverteras till en OLE DB-raduppsättning. Dessa rader kopieras till den här felfilen från datafilen "som den är".

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

Not

Ersätt <data-lake>.blob.core.windows.net med en lämplig URL.

Felfilen skapas när kommandot körs. Ett fel uppstår om filen redan finns. Dessutom skapas en kontrollfil med tillägget .ERROR.txt som refererar till varje rad i felfilen och ger feldiagnostik. Så snart felen har korrigerats kan data läsas in.

Från och med SQL Server 2017 (14.x) kan error_file_path ligga i Azure Storage.

ERRORFILE_DATA_SOURCE

Gäller för: SQL Server 2017 (14.x) och senare versioner.

Specificerar en namngiven extern datakälla som pekar på Azure Storage-platsen för felfilen för att hålla reda på fel som hittats under importen.

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

För mer information om hur du skapar externa datakällor, se SKAPA EXTERN DATAKÄLLA.

FÖRSTA RADEN

Anger numret på den första raden som ska läsas in. Standardvärdet är den första raden i den angivna datafilen. FIRSTROW är 1-baserad.

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

Attributet FIRSTROW är inte avsett att hoppa över kolumnrubriker. Instruktionen BULK INSERT har inte stöd för att hoppa över rubriker. Om du väljer att hoppa över rader tittar SQL Server Database Engine bara på fältavgränsarna och validerar inte data i fälten för överhoppade rader.

LASTROW

Anger numret på den sista raden som ska läsas in. Standardvärdet är 0, vilket anger den sista raden i den angivna datafilen.

BATCHSTORLEK

Anger antalet rader i en batch. Varje batch kopieras till servern som en transaktion. Om detta misslyckas checkar SQL Server in eller återställer transaktionen för varje batch. Som standard är alla data i den angivna datafilen en batch. Information om prestandaöverväganden finns i Prestandaöverväganden senare i den här artikeln.

KONTROLLBEGRÄNSNINGAR

Anger att alla begränsningar i måltabellen eller vyn måste kontrolleras under massimportåtgärden. Utan alternativet CHECK_CONSTRAINTS ignoreras eventuella CHECK begränsningar och FOREIGN KEY efter åtgärden markeras villkoret för tabellen som ej betrott.

UNIQUE begränsningar PRIMARY KEY tillämpas alltid. När du importerar till en teckenkolumn som har definierats med en NOT NULL begränsning infogar BULK INSERT en tom sträng när det inte finns något värde i textfilen.

Någon gång måste du undersöka begränsningarna för hela tabellen. Om tabellen inte var tom före massimportåtgärden kan kostnaden för att återuppta begränsningen överskrida kostnaden för att tillämpa CHECK begränsningar på inkrementella data.

En situation där du kanske vill inaktivera begränsningar (standardbeteendet) är om indata innehåller rader som bryter mot begränsningar. Med CHECK begränsningar inaktiverade kan du importera data och sedan använda Transact-SQL-instruktioner för att ta bort ogiltiga data.

Not

Alternativet MAXERRORS gäller inte för begränsningskontroll.

FIRE_TRIGGERS

Anger att alla infogningsutlösare som definierats i måltabellen körs under massimportåtgärden. Om utlösare definieras för INSERT åtgärder i måltabellen utlöses de för varje slutförd batch.

Om FIRE_TRIGGERS inte anges körs inga infogningsutlösare.

KEEPIDENTITY

Anger att identitetsvärdet eller värdena i den importerade datafilen ska användas för identitetskolumnen. Om KEEPIDENTITY inte anges verifieras identitetsvärdena för den här kolumnen men importeras inte och SQL Server tilldelar automatiskt unika värden baserat på de start- och inkrementsvärden som angavs när tabellen skapades. Om datafilen inte innehåller värden för identitetskolumnen i tabellen eller vyn använder du en formatfil för att ange att identitetskolumnen i tabellen eller vyn ska hoppas över när data importeras. SQL Server tilldelar automatiskt unika värden för kolumnen. Mer information finns i DBCC CHECKIDENT.

För mer information, se om att behålla identifieringsvärden, se Behåll identitetsvärden vid bulkimport av data.

KEEPNULLS

Anger att tomma kolumner ska behålla ett null-värde under massimportåtgärden, i stället för att ha några standardvärden för kolumnerna infogade. För mer information, se Behåll nollvärden eller standardvärden under bulkimport.

KILOBYTES_PER_BATCH

Anger det ungefärliga antalet kilobyte (KB) data per batch som kilobytes_per_batch. Som standard är KILOBYTES_PER_BATCH okänt. Information om prestandaöverväganden finns i Prestandaöverväganden senare i den här artikeln.

ORDER

Anger hur data i datafilen sorteras. Prestanda för massimport förbättras om data som importeras sorteras enligt det klustrade indexet i tabellen, om det finns några. Om datafilen sorteras i en annan ordning än ordningen på en klustrad indexnyckel, eller om det inte finns något grupperat index i tabellen, ignoreras ORDER-satsen. De kolumnnamn som anges måste vara giltiga kolumnnamn i måltabellen. Som standard förutsätter massinfogningsåtgärden att datafilen är osorterad. För optimerad massimport verifierar SQL Server också att importerade data är sorterade.

n är en platshållare som anger att flera kolumner kan anges.

ROWS_PER_BATCH

Anger det ungefärliga antalet rader med data i datafilen.

Som standard skickas alla data i datafilen till servern som en enda transaktion och antalet rader i batchen är okänt för frågeoptimeraren. Om du anger ROWS_PER_BATCH (med värdet > 0) använder servern det här värdet för att optimera massimportåtgärden. Värdet som anges för ROWS_PER_BATCH bör vara ungefär samma som det faktiska antalet rader. Information om prestandaöverväganden finns i Prestandaöverväganden senare i den här artikeln.

TABLOCK

Anger att ett lås på tabellnivå införskaffas under hela massimportåtgärden. En tabell kan läsas in samtidigt av flera klienter om tabellen inte har några index och TABLOCK har angetts. Som standard bestäms låsningsbeteendet av tabellalternativet tabelllås vid massinläsning. Om du håller ett lås under massimportåtgärden minskar låskonkurrationen i tabellen, i vissa fall kan prestandan förbättras avsevärt. Information om prestandaöverväganden finns i Prestandaöverväganden senare i den här artikeln.

För ett kolumnlagringsindex är låsningsbeteendet annorlunda eftersom det är internt indelat i flera rader. Varje tråd läser in data exklusivt i varje raduppsättning genom att ta ett exklusivt (X) lås på raduppsättningen som tillåter parallell databelastning med samtidiga datainläsningssessioner. Användningen av TABLOCK alternativet gör att tråden tar ett exklusivt lås på tabellen (till skillnad från massuppdateringslåset (BU) för traditionella raduppsättningar) vilket förhindrar att andra samtidiga trådar läser in data samtidigt.

Alternativ för indatafilformat

FORMAT

Gäller för: SQL Server 2017 (14.x) och senare versioner.

Anger en fil med kommaavgränsade värden som är kompatibel med RFC 4180 standard.

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

I Fabric Data Warehouse stödjer satsen samma format som satsenBULK INSERT, COPY INTOFORMAT = 'PARQUET' den stöds också.

FÄLTCITAT

Gäller för: SQL Server 2017 (14.x) och senare versioner.

Anger ett tecken som ska användas som citattecken i CSV-filen. Om det inte anges används citattecknet (") som citattecken, enligt definitionen i RFC 4180-standarden .

FORMATFILE

Anger den fullständiga sökvägen för en formatfil. En formatfil beskriver den datafil som innehåller lagrade svar som skapats med hjälp av verktyget bcp i samma tabell eller vy.

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

Not

Ersätt <data-lake>.blob.core.windows.net med en lämplig URL.

Formatfilen ska användas om:

  • Datafilen innehåller större eller färre kolumner än tabellen eller vyn.
  • Kolumnerna är i en annan ordning.
  • Kolumnavgränsarna varierar.
  • Det finns andra ändringar i dataformatet. Formatfiler skapas vanligtvis med hjälp av verktyget bcp och ändras med en textredigerare efter behov. För mer information, se bcp Utility och Skapa en formatfil med bcp.

Från och med SQL Server 2017 (14.x), och i Azure SQL Database, format_file_path kan det finnas i Azure Storage.

FORMATFILE_DATA_SOURCE

Gäller för: SQL Server 2017 (14.x) och senare versioner.

Specificerar en namngiven extern datakälla som pekar på Azure Storage-platsen för formatfilen för att definiera schemat för importerad data.

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

Specificerar vilken fältterminator som ska användas för char och widechar datafiler. Standardfältets avslutare är \t (tabbtecken). Mer information finns i Ange fält- och radavgränsare.

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

Specificerar radterminatorn som ska användas för char och widechar datafiler.

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

Standardradavslutaren är \r\n (vagnretur och radnytecken). Mer information finns i Ange fält- och radavgränsare.

Kompatibilitet

BULK INSERT tillämpar strikt dataverifiering och datakontroller av data som lästs från en fil som kan orsaka att befintliga skript misslyckas när de körs på ogiltiga data. Verifierar till exempel BULK INSERT att:

  • De inbyggda representationerna av flyttal eller verkliga datatyper är giltiga.
  • Unicode-data har en jämn bytelängd.

Datatyper

Konverteringar av datatypen Sträng till decimal

Konverteringarna av datatypen sträng-till-decimal som används i BULK INSERT följer samma regler som funktionen Transact-SQL CONVERT , som avvisar strängar som representerar numeriska värden som använder vetenskaplig notation. Därför BULK INSERT behandlar sådana strängar som ogiltiga värden och rapporterar konverteringsfel.

Om du vill kringgå det här beteendet använder du en formatfil för att massimportera vetenskaplig notation flytta data till en decimalkolumn. I formatfilen beskriver du uttryckligen kolumnen som verkliga eller flytta data. Mer information om dessa datatyper finns i flyttal och verkliga.

Formatfiler representerar verkliga data som SQLFLT4 datatyp och flytta data som SQLFLT8 datatyp. För information om filer i icke-XML-format, se Specificera fillagringstyp med bcp.

Exempel på import av ett numeriskt värde som använder vetenskaplig notation

I det här exemplet används följande tabell i databasen bulktest:

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

Användaren vill massimportera data till tabellen t_float. Datafilen, C:\t_float-c.dat, innehåller vetenskapliga notationsflötdata , till exempel:

8.0000000000000002E-2 8.0000000000000002E-2

När du kopierar det här exemplet bör du vara medveten om olika textredigerare och kodningar som sparar tabbtecken (\t) som blanksteg. Ett fliktecken förväntas senare i det här exemplet.

Det går dock BULK INSERT inte att importera dessa data direkt till t_float, eftersom dess andra kolumn, c2, använder decimaldatatypen . Därför krävs en formatfil. Formatfilen måste mappa den vetenskapliga notationen flytta data till decimalformatet för kolumn c2.

Följande formatfil använder datatypen SQLFLT8 för att mappa det andra datafältet till den andra kolumnen:

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

Om du vill använda den här formatfilen (med filnamnet C:\t_floatformat-c-xml.xml) för att importera testdata till testtabellen utfärdar du följande Transact-SQL-instruktion:

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

Viktig

Azure SQL Database och Fabric Data Warehouse stöder endast läsning från URI (till exempel Azure Storage).

Datatyper för massexport eller import av SQLXML-dokument

Om du vill massexportera eller importera SQLXML-data använder du någon av följande datatyper i formatfilen:

Datatyp Effekt
SQLCHAR eller SQLVARCHAR Data skickas på klientkodsidan eller på kodsidan som är underförstådd av sorteringen). Effekten är densamma som att ange DATAFILETYPE = 'char' utan att ange en formatfil.
SQLNCHAR eller SQLNVARCHAR Data skickas som Unicode. Effekten är densamma som att ange DATAFILETYPE = 'widechar' utan att ange en formatfil.
SQLBINARY eller SQLVARBIN Data skickas utan konvertering.

Anmärkningar

För en jämförelse av BULK INSERT satsen, satsen INSERT ... SELECT * FROM OPENROWSET(BULK...) och kommandot bcp , se Bulk Import and Export of Data.

Information om hur du förbereder data för massimport finns i Förbereda data för massexport eller import.

Instruktionen BULK INSERT kan köras i en användardefinierad transaktion för att importera data till en tabell eller vy. Om du vill använda flera matchningar för massimport av data kan en transaktion ange BATCHSIZE satsen i -instruktionen BULK INSERT . Om en transaktion med flera batchar återställs återställs varje batch som transaktionen skickas till SQL Server.

Samverkan

Importera data från en CSV-fil

Från och med SQL Server 2017 (14.x) BULK INSERT har stöd för CSV-formatet, liksom Azure SQL Database.

Innan SQL Server 2017 (14.x) stöds inte kommaavgränsade värdefiler (CSV) av SQL Server-massimportåtgärder. I vissa fall kan dock en CSV-fil användas som datafil för massimport av data till SQL Server. Information om kraven för att importera data från en CSV-datafil finns i Förbereda data för massexport eller import.

Loggbeteende

Information om när radinfogningsåtgärder som utförs av massimport till SQL Server loggas i transaktionsloggen finns i Krav för minimal loggning vid massimport. Minimal loggning stöds inte i Azure SQL Database.

Begränsningar

När du använder en formatfil med BULK INSERTkan du endast ange upp till 1 024 fält. Detta är samma som det maximala antalet kolumner som tillåts i en tabell. Om du använder en formatfil med BULK INSERT med en datafil som innehåller fler än 1 024 fält BULK INSERT genererar felet 4822. Bcp-verktyget har inte den här begränsningen, så för datafiler som innehåller fler än 1 024 fält använder BULK INSERT du utan en formatfil eller använder kommandot bcp.

Prestandaöverväganden

Om antalet sidor som ska tömmas i en enda batch överskrider ett internt tröskelvärde kan en fullständig genomsökning av buffertpoolen ske för att identifiera vilka sidor som ska tömmas när batchen checkas in. Den här fullständiga genomsökningen kan skada massimportens prestanda. Ett troligt fall av att överskrida det interna tröskelvärdet inträffar när en stor buffertpool kombineras med ett långsamt I/O-undersystem. För att undvika buffertspill på stora datorer använder du antingen inte tipset TABLOCK (som tar bort massoptimeringarna) eller använder en mindre batchstorlek (vilket bevarar massoptimeringarna).

Du bör testa olika batchstorlekar med din databelastning för att ta reda på vad som fungerar bäst för dig. Tänk på att batchstorleken har partiella rollback-konsekvenser. Om processen misslyckas och innan du använder BULK INSERT igen kan du behöva utföra ytterligare manuellt arbete för att ta bort en del av raderna som infogades innan ett fel uppstod.

Med Azure SQL Database kan du överväga att tillfälligt öka prestandanivån för databasen eller instansen före importen om du importerar en stor mängd data.

Säkerhet

Delegering av säkerhetskonto (personifiering)

Om en användare använder en SQL Server-inloggning används säkerhetsprofilen för SQL Server-processkontot. En inloggning med SQL Server-autentisering kan inte autentiseras utanför databasmotorn. När ett BULK INSERT kommando initieras av en inloggning med SQL Server-autentisering görs därför anslutningen till data med hjälp av säkerhetskontexten för SQL Server-processkontot (det konto som används av SQL Server Database Engine-tjänsten).

Om du vill läsa källdata måste du bevilja det konto som används av SQL Server Database Engine åtkomst till källdata. Om en SQL Server-användare däremot loggar in med hjälp av Windows-autentisering kan användaren bara läsa de filer som kan nås av användarkontot, oavsett säkerhetsprofilen för SQL Server-processen.

När du kör -instruktionen BULK INSERT med hjälp av sqlcmd eller osql, från en dator, infogar data i SQL Server på en andra dator och anger en data_file på tredje dator med hjälp av en UNC-sökväg, kan du få ett 4861-fel.

Lös det här felet genom att använda SQL Server-autentisering och ange en SQL Server-inloggning som använder säkerhetsprofilen för SQL Server-processkontot, eller konfigurera Windows för att aktivera delegering av säkerhetskonton. Information om hur du aktiverar ett användarkonto som ska vara betrott för delegering finns i Windows-hjälpen.

Mer information om detta och andra säkerhetsöverväganden för användning finns BULK INSERTi Använda BULK INSERT eller OPENROWSET(BULK...) för att importera data till SQL Server.

När du importerar från Azure Storage och datan inte är offentlig (anonym åtkomst), skapa en DATABAS-SCOPED CREDENTIAL baserad på en SAS-nyckel krypterad med en databashuvudnyckel (DMK), och skapa sedan en extern databaskälla för användning i ditt BULK INSERT kommando.

Du kan också skapa en DATABASE SCOPED CREDENTIAL- baserat på MANAGED IDENTITY för att auktorisera begäranden om dataåtkomst i icke-offentliga lagringskonton. När man använder MANAGED IDENTITY, måste Azure Storage ge behörigheter till instansens hanterade identitet genom att lägga till Storage Blob Data Contributor den inbyggda Azure rollbaserade åtkomstkontrollen (RBAC) rollen som ger läs-/skrivåtkomst till den hanterade identiteten för nödvändiga Azure Storage-containrar. Azure SQL Managed Instance har en systemtilldelad hanterad identitet och kan också ha en eller flera användartilldelade hanterade identiteter. Du kan använda antingen systemtilldelade hanterade identiteter eller användartilldelade hanterade identiteter för att auktorisera begäranden. För auktorisering används identiteten default för den hanterade instansen (dvs. den primära användartilldelade hanterade identiteten eller den systemtilldelade hanterade identiteten om användartilldelad hanterad identitet inte har angetts). För ett exempel, se Importera data från en fil i Azure Storage.

Viktig

Managed Identity gäller för Azure SQL och SQL Server 2025 (17.x) och senare versioner.

Behörigheter

Följande behörigheter gäller för den plats där data massimporteras (målet).

Kräver INSERT och ADMINISTER BULK OPERATIONS behörigheter. I Azure SQL Database INSERTADMINISTER DATABASE BULK OPERATIONS krävs behörigheter. ADMINISTER BULK OPERATIONS behörigheter eller bulkadmin-rollen stöds inte för SQL Server i Linux. Endast sysadmin kan utföra massinfogningar för SQL Server i Linux.

Dessutom ALTER TABLE krävs behörighet om ett eller flera av följande villkor är uppfyllda:

  • Begränsningar finns och alternativet CHECK_CONSTRAINTS har inte angetts.

    Att inaktivera begränsningar är standardbeteendet. Om du vill kontrollera begränsningar explicit använder du alternativet CHECK_CONSTRAINTS .

  • Utlösare finns och alternativet FIRE_TRIGGER har inte angetts.

    Utlösare utlöses inte som standard. Använd alternativet för FIRE_TRIGGER att utlösa utlösare explicit.

  • Du använder alternativet KEEPIDENTITY för att importera identitetsvärde från datafilen.

Exempel

Kodexemplen i den här artikeln använder AdventureWorks2025- eller AdventureWorksDW2025-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.

Viktig

Azure SQL Database och Fabric Warehouse stöder endast läsning från Azure Storage.

A. Använda pipes för att importera data från en fil

I följande exempel importeras information om orderinformation till tabellen AdventureWorks2022.Sales.SalesOrderDetail från den angivna datafilen med hjälp av ett pipe (|) som fältavgränsare och |\n som radavgränsare.

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

B. Använd argumentet FIRE_TRIGGERS

I följande exempel anges argumentet FIRE_TRIGGERS.

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

C. Använda radmatning som radavgränsare

I följande exempel importeras en fil som använder radflödet som en radavgränsare, till exempel en UNIX-utdata:

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

Not

I Windows \n ersätts automatiskt med \r\n.

D. Ange en kodsida

I följande exempel visas hur du anger en kodsida.

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

E. Importera data från en CSV-fil

I följande exempel visas hur du anger en CSV-fil som hoppar över rubriken (första raden), med ; som fältavgränsare och 0x0a som radavgränsare:

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

I följande exempel visas hur du anger en CSV-fil i UTF-8-format (med hjälp av en CODEPAGE av 65001), hoppar över rubriken (första raden), med ; som fältavslutare och 0x0a som radavslutare:

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

F. Importera data från en fil i Azure Storage

Ladda data från en CSV i Azure Storage med SAS-token

Följande exempel visar hur man laddar data från en CSV-fil i en Azure Storage-plats där du har skapat en Shared Access Signature (SAS). Azure Storage-platsen är konfigurerad som en extern datakälla, vilket kräver en databasbaserad inloggningsinformation med en SAS-nyckel som krypteras med en DMK i användardatabasen.

Not

Se till att du inte har en lead ? i SAS-token, och att du åtminstone har läsbehörighet på objektet som ska laddas srt=o&sp=r, och att utgångsperioden är giltig (alla datum är i UTC-tid).

(Valfritt) En DMK krävs inte om en DATABASE SCOPED CREDENTIAL inte är nödvändig, eftersom blobben är konfigurerad för offentlig (anonym) åtkomst.

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

(Valfritt) A DATABASE SCOPED CREDENTIAL krävs inte eftersom blobben är konfigurerad för offentlig (anonym) åtkomst.

Inkludera inte en inledning ? i SAS-tokenen. Se till att du åtminstone har läsbehörighet på objektet som ska laddas (srt=o&sp=r), och att utgångstiden är giltig (alla datum är i UTC-tid).

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

Not

CREDENTIAL krävs inte om en blob är konfigurerad för offentlig (anonym) åtkomst.

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

Ladda data från en CSV i Azure Storage med en hanterad identitet

Följande exempel visar hur man använder kommandot BULK INSERT för att ladda data från en CSV-fil i en Azure Storage-plats med Managed Identity. Azure Storage-platsen är konfigurerad som en extern datakälla.

(Valfritt) En DMK krävs inte om en DATABASE SCOPED CREDENTIAL inte är nödvändig, eftersom blobben är konfigurerad för offentlig (anonym) åtkomst.

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

(Valfritt) A DATABASE SCOPED CREDENTIAL krävs inte, eftersom blobben är konfigurerad för offentlig (anonym) åtkomst:

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

Tilldela rollen Storage Blob Data Contributor, för att ge läs-/skrivåtkomst till den hanterade identiteten för de nödvändiga Azure Storage-containrarna.

Not

CREDENTIAL krävs inte om en blob är konfigurerad för offentlig (anonym) åtkomst.

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

Viktig

Managed identity gäller SQL Server 2025 (17.x) och senare versioner, samt Azure SQL.

G. Importera data från en fil i Azure Storage och ange en felfil

Följande exempel visar hur man laddar data från en CSV-fil i en Azure Storage-plats, som är konfigurerad som en extern datakälla, och även specificerar en felfil. Du behöver en databasomfattande autentiseringsuppgift med hjälp av en signatur för delad åtkomst. Om du kör på Azure SQL Database ERRORFILE bör alternativet åtföljas av ERRORFILE_DATA_SOURCE, annars kan importen misslyckas med behörighetsfel. Filen som anges i ERRORFILE bör inte finnas i containern.

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

För fullständiga BULK INSERT exempel inklusive konfiguration av legitimation och extern datakälla, se Exempel på massåtkomst till data i Azure Storage.

Fler exempel

Andra BULK INSERT exempel finns i följande artiklar: