BULK INSERT (Transact-SQL)
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
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' | '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 ]
)]
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 |
Källautentisering | Windows-autentisering, SAS | Microsoft Entra-ID, SAS-token, hanterad identitet | Microsoft Entra-ID |
Alternativ som inte stöds |
* jokertecken i sökvägen |
* jokertecken i sökvägen |
DATA_SOURCE , FORMATFILE_DATA_SOURCE , ERRORFILE , ERRORFILE_DATA_SOURCE |
Aktiverade alternativ men utan effekt |
KEEPIDENTITY , FIRE_TRIGGERS , CHECK_CONSTRAINTS , TABLOCK , ORDER , ROWS_PER_BATCH , KILOBYTES_PER_BATCH och BATCHSIZE gäller inte. De genererar inte ett syntaxfel, men de har ingen effekt |
Not
BULK INSERT-instruktionen finns i förhandsversion i Fabric Data Warehouse.
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 (Transact-SQL).
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 Blob Storage (inklusive nätverk, diskett, 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 Warehouse stöder endast läsning från Azure Blob Storage.
Från och med SQL Server 2017 (14.x) kan data_file finnas i Azure Blob Storage. I så fall måste du också ange data_source_name
alternativ. Ett exempel finns i Importera data från en fil i Azure Blob Storage.
Infrastrukturlager stöder två olika sökvägsformat för att ange källsökvä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 Warehouse stöder *
jokertecken som kan matcha alla tecken i URI:n och gör att du kan definiera ett URI-mönster för de filer som ska importeras. Till exempel:
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
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.
CHECK_CONSTRAINTS
Anger att alla begränsningar i måltabellen eller vyn måste kontrolleras under massimportåtgärden. Utan alternativet CHECK_CONSTRAINTS ignoreras alla CHECK- och FOREIGN KEY-begränsningar, och efter åtgärden markeras villkoret för tabellen som ej betrott.
BEGRÄNSNINGAR FÖR UNIK OCH PRIMÄRNYCKEL tillämpas alltid. När du importerar till en teckenkolumn som har definierats med villkoret NOT NULL 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.
CODEPAGE = { 'ACP' | OEM | 'RAW' | 'code_page' }
Anger kodsidan för data i datafilen. CODEPAGE är endast relevant om data innehåller tecken, varchareller text kolumner med teckenvärden som är större än 127 eller mindre än 32. Ett exempel finns i Ange en kodsida.
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 alternativet RAW för CODEPAGE.
Du bör ange ett sorteringsnamn för varje kolumn i en formatfil.
CODEPAGE-värde | Beskrivning |
---|---|
AVS | Kolumner med tecken, varchareller text datatyp konverteras från kodsidan ANSI/Microsoft Windows (ISO 1252) till SQL Server-kodsidan. |
OEM (standard) | Kolumner med tecken, varchareller text datatyp konverteras från systemets OEM-kodsida till SQL Server-kodsidan. |
RÅ | 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). |
DATAFILETYPE = { 'char' | "native" | "widechar" | "widenative" }
Anger att BULK INSERT utför importåtgärden med det angivna värdet för datafilstypen.
DATAFILETYPE-värde | Alla data som representeras i: |
---|---|
tecken (standard) | Teckenformat. Mer information finns i Använda teckenformat för att importera eller exportera data (SQL Server). |
interna | 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). Mer information finns i Använda inbyggt format för att importera eller exportera data (SQL Server). |
widechar | Unicode-tecken. Mer information finns i Använda Unicode-teckenformat för att importera eller exportera data (SQL Server). |
vidgas | Interna datatyper (databas), förutom i tecken, varcharoch text kolumner, där data lagras som Unicode. Skapa widenative datafil genom att massimportera data från SQL Server med hjälp av verktyget bcp. Det widenative-värdet erbjuder ett alternativ med högre prestanda än widechar-. Om datafilen innehåller ANSI-utökade tecken anger du bredare. Mer information finns i Använda unicode-inbyggt format för att importera eller exportera data (SQL Server). |
DATA_SOURCE = "data_source_name"
gäller för: SQL Server 2017 (14.x) och Azure SQL Database.
Anger en namngiven extern datakälla som pekar på Azure Blob Storage-platsen för filen som ska importeras. Den externa datakällan måste skapas med hjälp av alternativet TYPE = BLOB_STORAGE
som lades till i SQL Server 2017 (14.x). Mer information finns i CREATE EXTERNAL DATA SOURCE. Ett exempel finns i Importera data från en fil i 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"
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".
Felfilen skapas när kommandot körs. Ett fel uppstår om filen redan finns. Dessutom skapas en kontrollfil som har 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 finnas i Azure Blob Storage.
ERRORFILE_DATA_SOURCE = "errorfile_data_source_name"
gäller för: SQL Server 2017 (14.x).
Anger en namngiven extern datakälla som pekar på Azure Blob Storage-platsen för felfilen som innehåller fel som hittades under importen. Den externa datakällan måste skapas med hjälp av alternativet TYPE = BLOB_STORAGE
som lades till i SQL Server 2017 (14.x). Mer information finns i CREATE EXTERNAL DATA SOURCE.
FIRSTROW = first_row
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.
Attributet FIRSTROW är inte avsett att hoppa över kolumnrubriker. Att hoppa över rubriker stöds inte av BULK INSERT-instruktionen. 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.
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 har angetts körs inga infogningsutlösare.
FORMATFILE_DATA_SOURCE = "data_source_name"
gäller för: SQL Server 2017 (14.x).
Anger en namngiven extern datakälla som pekar på Azure Blob Storage-platsen för formatfilen som definierar schemat för importerade data. Den externa datakällan måste skapas med hjälp av alternativet TYPE = BLOB_STORAGE
som lades till i SQL Server 2017 (14.x). Mer information finns i CREATE EXTERNAL DATA SOURCE.
KEEPIDENTITY
Anger att identitetsvärdet eller värdena i den importerade datafilen ska användas för identitetskolumnen. Om KEEPIDENTITY inte har angetts 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 (Transact-SQL).
Mer information finns i om att behålla identifierarvärden i Behåll identitetsvärden vid massimport av data (SQL Server).
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. Mer information finns i Behåll nullvärden eller Använd standardvärden under massimport (SQL Server).
KILOBYTES_PER_BATCH = 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.
LASTROW = last_row
Anger numret på den sista raden som ska läsas in. Standardvärdet är 0, vilket anger den sista raden i den angivna datafilen.
MAXERRORS = max_errors
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.
Alternativet MAX_ERRORS gäller inte för begränsningskontroller eller konvertering av pengar och storint datatyper.
ORDER ( { kolumn [ ASC | DESC ] } [ ,... n ] )
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 = 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 ett värde > 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 ska vara ungefär detsamma 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 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 X-lås på tabellen (till skillnad från BU-lås för traditionella raduppsättningar) vilket förhindrar att andra samtidiga trådar läser in data samtidigt.
Alternativ för indatafilformat
FORMAT = "CSV"
gäller för: SQL Server 2017 (14.x).
Anger en fil med kommaavgränsade värden som är kompatibel med RFC 4180 standard.
BULK INSERT Sales.Orders
FROM '\\SystemX\DiskZ\Sales\data\orders.csv'
WITH ( FORMAT = 'CSV');
FIELDQUOTE = 'field_quote'
gäller för: SQL Server 2017 (14.x).
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 standard.
FORMATFILE = 'format_file_path'
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. 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. Mer information finns i bcp Utility and Create a format file.
Från och med SQL Server 2017 (14.x) och i Azure SQL Database kan format_file_path
finnas i Azure Blob Storage.
FIELDTERMINATOR = "field_terminator"
Anger fältavgränsaren som ska användas för tecken och widechar datafiler. Standardfältets avslutare är \t
(tabbtecken). Mer information finns i Ange fält- och radavgränsare (SQL Server).
ROWTERMINATOR = "row_terminator"
Anger radavgränsaren som ska användas för tecken och widechar datafiler. Standardradavslutaren är \r\n
(nytt radtecken). Mer information finns i Ange fält- och radavgränsare (SQL Server).
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. BULK INSERT verifierar till exempel 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 behandlar BULK INSERT 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 (Transact-SQL).
Formatfiler representerar verkliga data som SQLFLT4 datatyp och flytta data som SQLFLT8 datatyp. Information om filer som inte är XML-format finns i Ange fillagringstyp med hjälp av bcp (SQL Server).
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 vetenskaplig notation flytta data. 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.
BULK INSERT kan dock inte importera dessa data direkt till t_float
eftersom dess andra kolumn, c2
, använder datatypen decimal
. 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 SQLFLT8
datatyp 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 stöder endast läsning från Azure Blob 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
En jämförelse av BULK INSERT-instruktionen, INSERT ... SELECT * FROM OPENROWSET(BULK...)
-instruktionen och kommandot bcp
finns i Massimport och export av data.
Information om hur du förbereder data för massimport finns i Förbereda data för massexport eller import.
BULK INSERT-instruktionen 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 BULK INSERT-instruktionen. Om en transaktion med flera batchar återställs återställs varje batch som transaktionen har skickat till SQL Server.
Samverkan
Importera data från en CSV-fil
Från och med SQL Server 2017 (14.x) stöder BULK INSERT 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 (SQL Server).
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 i massimport. Minimal loggning stöds inte i Azure SQL Database.
Inskränkningar
När du använder en formatfil med BULK INSERT kan 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 genererar BULK INSERT felet 4822. Verktyget bcp har inte den här begränsningen, så för datafiler som innehåller fler än 1 024 fält använder du BULK INSERT utan 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 TABLOCK-tipset (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 BULK INSERT-instruktionen 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 att använda BULK INSERT finns i Importera massdata med hjälp av BULK INSERT eller OPENROWSET(BULK...) (SQL Server).
När du importerar från Azure Blob Storage och data inte är offentliga (anonym åtkomst), skapar du en DATABASE SCOPED CREDENTIAL- baserat på en SAS-nyckel krypterad med en MASTER KEYoch skapar sedan en extern databaskälla för användning i kommandot BULK INSERT.
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 du använder MANAGED IDENTITY
måste Azure Storage bevilja behörigheter till den hanterade identiteten för instansen genom att lägga till Storage Blob Data Contributor inbyggd Rollbaserad åtkomstkontroll för Azure (RBAC) som ger läs-/skrivåtkomst till den hanterade identiteten för nödvändiga Azure Blob 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 den default
identiteten för den hanterade instansen (som är primär användartilldelad hanterad identitet eller systemtilldelad hanterad identitet om användartilldelad hanterad identitet inte har angetts). Ett exempel finns i Importera data från en fil i Azure Blob Storage.
Viktig
Hanterad identitet gäller endast för Azure SQL. SQL Server stöder inte hanterad identitet.
Behörigheter
Kräver behörigheter för INSERT och ADMIN BULK OPERATIONS. I Azure SQL Database krävs behörigheterna INSERT och ADMINISTER DATABASE BULK OPERATIONS. ADMIN BULK OPERATIONS-behörigheter eller bulkadmin roll stöds inte för SQL Server i Linux. Endast sysadmin kan utföra massinfogningar för SQL Server i Linux.
Dessutom krävs ALTER TABLE-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 FIRE_TRIGGER för att utlösa utlösare explicit.
Du använder alternativet KEEPIDENTITY för att importera identitetsvärdet från datafilen.
Exempel
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'
);
Viktig
Azure SQL Database stöder endast läsning från Azure Blob Storage.
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
);
Viktig
Azure SQL Database stöder endast läsning från Azure Blob Storage.
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 VARCHAR(1000);
SET @bulk_cmd = 'BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>''
WITH (ROWTERMINATOR = '''+CHAR(10)+''')';
EXEC(@bulk_cmd);
Not
På grund av hur Microsoft Windows behandlar textfiler ersätts \n
automatiskt med \r\n
.
Viktig
Azure SQL Database stöder endast läsning från Azure Blob Storage.
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 = ','
);
Viktig
Azure SQL Database stöder endast läsning från Azure Blob Storage.
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');
Viktig
Azure SQL Database stöder endast läsning från Azure Blob Storage.
F. Importera data från en fil i Azure Blob Storage
I följande exempel visas hur du läser in data från en CSV-fil på en Azure Blob Storage-plats där du har skapat en signatur för delad åtkomst (SAS). Azure Blob Storage-platsen är konfigurerad som en extern datakälla, vilket kräver en databasomfångad autentiseringsuppgift med hjälp av en SAS-nyckel som krypteras med hjälp av en huvudnyckel i användardatabasen.
--> 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');
I följande exempel visas hur du använder KOMMANDOT BULK INSERT för att läsa in data från en csv-fil på en Azure Blob Storage-plats med hjälp av hanterad identitet. Azure Blob Storage-platsen är konfigurerad som en extern datakälla.
--> 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');
Viktig
Hanterad identitet gäller endast för Azure SQL. SQL Server stöder inte hanterad identitet.
Viktig
Azure SQL stöder endast läsning från Azure Blob Storage.
G. Importera data från en fil i Azure Blob Storage och ange en felfil
I följande exempel visas hur du läser in data från en CSV-fil på en Azure Blob Storage-plats, som har konfigurerats som en extern datakälla och även anger en felfil. Du behöver en databasomfattande autentiseringsuppgift med hjälp av en signatur för delad åtkomst. Om du kör i Azure SQL Database bör alternativet ERRORFILE å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');
Fullständiga BULK INSERT
exempel, inklusive konfiguration av autentiseringsuppgifter och extern datakälla, finns i Exempel på massåtkomst till data i Azure Blob Storage.
Fler exempel
Andra BULK INSERT
exempel finns i följande artiklar:
- Exempel på massimport och export av XML-dokument (SQL Server)
- behåll identitetsvärden vid massimport av data (SQL Server)
- behålla nullvärden eller använda standardvärden under massimport (SQL Server)
- Ange fält- och radavgränsare (SQL Server)
- Använda en formatfil för att massimportera data (SQL Server)
- Använda teckenformat för att importera eller exportera data (SQL Server)
- använda internt format för att importera eller exportera data (SQL Server)
- använda Unicode-teckenformat för att importera eller exportera data (SQL Server)
- Använda unicode-inbyggt format för att importera eller exportera data (SQL Server)
- Använd en formatfil för att hoppa över en tabellkolumn (SQL Server)
- Använda en formatfil för att mappa tabellkolumner till Data-File fält (SQL Server)