Sdílet prostřednictvím


HROMADNÁ VLOŽKA (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLSklad v Microsoft Fabric

Importuje datový soubor do databázové tabulky nebo zobrazení v uživatelsky zadaném formátu v SQL Serveru.

Transact-SQL konvence syntaxe

Syntaxe

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

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

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

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

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

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

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

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

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

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

    ) ]

Argumenty

Příkaz BULK INSERT má různé argumenty a možnosti na různých platformách. Rozdíly jsou shrnuty v následující tabulce:

Vlastnost SQL Server Azure SQL Database a Spravovaná instance Azure SQL Datový sklad Fabrique
Zdroj dat Místní cesta, síťová cesta (UNC) nebo Azure Storage Azure Storage Azure Storage, One Lake
Ověření zdroje Ověřování systému Windows, SAS Microsoft Entra ID, token SAS, spravovaná identita Microsoft Entra ID
Nepodporované možnosti * divoké karty v path, FORMAT = 'PARQUET' * divoké karty v path, FORMAT = 'PARQUET' DATAFILETYPE = {'native' | 'widenative'}
Povolené možnosti, ale bez efektu KEEPIDENTITY, FIRE_TRIGGERS, CHECK_CONSTRAINTS, TABLOCK, ORDER, , ROWS_PER_BATCH, KILOBYTES_PER_BATCHa BATCHSIZE nejsou použitelné. Nevyvolají chybu syntaxe, ale nemají žádný vliv.

database_name

Název databáze, ve které se nachází zadaná tabulka nebo zobrazení. Pokud není zadaný, database_name je aktuální databáze.

schema_name

Určuje název schématu tabulky nebo zobrazení. schema_name je volitelné, pokud výchozí schéma pro uživatele provádějící operaci hromadného importu je schéma zadané tabulky nebo zobrazení. Pokud není zadané schéma a výchozí schéma uživatele provádějícího operaci hromadného importu se liší od zadané tabulky nebo zobrazení, SQL Server vrátí chybovou zprávu a operace hromadného importu se zruší.

table_name

Určuje název tabulky nebo zobrazení pro hromadný import dat do. Lze použít pouze zobrazení, ve kterých všechny sloupce odkazují na stejnou základní tabulku. Další informace o omezeních pro načítání dat do zobrazení naleznete v tématu INSERT.

Z 'data_file'

Určuje úplnou cestu k datovému souboru, který obsahuje data pro import do zadané tabulky nebo zobrazení.

BULK INSERT lze importovat data z disku nebo Azure Storage (včetně sítě, diskety, pevného disku a podobně).

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

data_file musí zadat platnou cestu ze serveru, na kterém běží SQL Server. Pokud data_file je vzdálený soubor, zadejte název UNC (Universal Naming Convention). Název UNC má formulář \\SystemName\ShareName\Path\FileName. Například:

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 a Fabric Data Warehouse podporují čtení dat z URI, ale nepodporují lokální cesty k souborům.

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

Od SQL Server 2017 (14.x) může být data_file v Azure Storage. V takovém případě musíte také zadat data_source_name možnost. Pro příklad viz Import dat ze souboru v Azure Storage.

Fabric Data Warehouse podporuje dva různé styly cest pro určení zdrojové cesty:

  • 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 podporuje * žolíky, které mohou odpovídat jakémukoliv znaku v URI, a umožňují definovat vzor URI pro soubory, které mají být importovány. Například:

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

Poznámka:

Nahraďte <data-lake>.blob.core.windows.net příslušnou adresou URL.

zdroj dat

Platí na: SQL Server 2017 (14.x) a novější verze, Azure SQL Database a Warehouse v Microsoft Fabric.

Specifikuje pojmenovaný externí zdroj dat, který ukazuje na kořenovou lokaci Azure Storage pro import souboru.

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

Poznámka:

Nahraďte <data-lake>.blob.core.windows.net příslušnou adresou URL.

Další informace naleznete v tématu CREATE EXTERNAL DATA SOURCE.

Cesta k souboru v klauzuli FROM musí být relativní cesta, která bude připojena ke kořenové lokalitě definované ve zdroji externích dat.

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

Poznámka:

Pro jednoduchost následující příklady používají relativní cesty a předdefinované externí datové zdroje.

CODEPAGE

Určuje znakovou stránku dat v datovém souboru. CODEPAGE je relevantní pouze v případě, že data obsahují znak, varchar nebo textové sloupce s hodnotami znaků většími nebo menšími 127 než 32. Příklad najdete v tématu Zadání znakové stránky.

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 není podporovaná možnost v Linuxu pro SQL Server 2017 (14.x). Pro SQL Server 2019 (15.x) je povolena 'RAW'pouze CODEPAGE možnost .

Pro každý sloupec ve formátu souboru byste měli zadat název kolace.

CODEPAGE hodnota Popis
ACP Sloupce znaku, varchar nebo textového datového typu se převedou ze znakové stránky ANSI/Microsoft Windows (ISO 1252) na znakovou stránku SQL Serveru.
OEM (výchozí) Sloupce znaku, varcharu nebo textového datového typu se převedou ze systémové OEM znakové stránky na znakovou stránku SQL Serveru.
RAW Nedojde k žádnému převodu z jedné znakové stránky na jinou. RAW je nejrychlejší možností.
strana_kódu Konkrétní číslo znakové stránky, například 850.

Verze před SQL Serverem 2016 (13.x) nepodporují kódovou stránku 65001 (kódování UTF-8).
CODEPAGE hodnota Popis
ACP Sloupce znaku, varchar nebo textového datového typu se převedou ze znakové stránky ANSI/Microsoft Windows (ISO 1252) na znakovou stránku SQL Serveru.
strana_kódu Konkrétní číslo znakové stránky, například 850.

Verze před SQL Serverem 2016 (13.x) nepodporují kódovou stránku 65001 (kódování UTF-8).

DATAFILETYPE

Určuje, že BULK INSERT provede operaci importu pomocí zadané hodnoty typu datového souboru.

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

Poznámka:

Nahraďte <data-lake>.blob.core.windows.net příslušnou adresou URL.

DATAFILETYPE hodnota Všechna data reprezentovaná v
char (výchozí) Formát znaků.

Pro více informací viz Použít formát znaků pro import nebo export dat.
widechar Znaky Unicode

Pro více informací viz Použít formát znaků Unicode pro import nebo export dat.
native Nativní datové typy (databáze) Vytvořte nativní datový soubor hromadným importem dat z SQL Serveru pomocí nástroje bcp .

Nativní hodnota nabízí vyšší výkon alternativu k hodnotě znaku. Nativní formát se doporučuje, když hromadně přenášíte data mezi více instancemi SQL Serveru pomocí datového souboru, který neobsahuje žádné znaky rozšířené nebo dvoubajtové znakové sady (DBCS).

Pro více informací viz Použít nativní formát pro import nebo export dat.
widenative Nativní datové typy (databáze), s výjimkou znaků, varchar a textových sloupců, ve kterých jsou data uložena jako Unicode. widenative Vytvořte datový soubor hromadným importem dat z SQL Serveru pomocí nástroje bcp.

Hodnota widenative nabízí vyšší výkon alternativu k widechar. Pokud datový soubor obsahuje rozšířené znaky ANSI, zadejte widenative.

Pro více informací viz Použít nativní formát Unicode pro import nebo export dat.
DATAFILETYPE hodnota Všechna data reprezentovaná v
char (výchozí) Formát znaků.

Pro více informací viz Použít formát znaků pro import nebo export dat.
widechar Znaky Unicode

Pro více informací viz Použít formát znaků Unicode pro import nebo export dat.

MAXERRORS

Určuje maximální počet chyb syntaxe povolených v datech před zrušením operace hromadného importu. Každý řádek, který nelze importovat operací hromadného importu, se ignoruje a počítá se jako jedna chyba. Pokud není zadaný max_errors , výchozí hodnota je 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);

Tato MAX_ERRORS možnost se nevztahuje na kontroly omezení ani na převod měn abigint datových typů.

ERRORFILE

Určuje soubor použitý ke shromažďování řádků s chybami formátování a nelze je převést na sadu řádků OLE DB. Tyto řádky se zkopírují do tohoto chybového souboru z datového souboru tak, jak jsou.

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

Poznámka:

Nahraďte <data-lake>.blob.core.windows.net příslušnou adresou URL.

Při spuštění příkazu se vytvoří soubor chyby. Pokud soubor již existuje, dojde k chybě. Kromě toho se vytvoří řídicí soubor s příponou .ERROR.txt , který odkazuje na každý řádek v souboru chyby a poskytuje diagnostiku chyb. Jakmile se chyby opraví, je možné načíst data.

Od SQL Server 2017 (14.x) může být error_file_path v Azure Storage.

ERRORFILE_DATA_SOURCE

Platí pro: SQL Server 2017 (14.x) a novější verze.

Specifikuje pojmenovaný externí zdroj dat směřující na Azure Storage umístění chybového souboru, aby sledoval chyby nalezené během importu.

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

Pro více informací o vytváření externích datových zdrojů viz VYTVOŘIT EXTERNÍ DATOVÝ ZDROJ.

PRVNÍ ŘADA

Určuje počet prvního řádku, který se má načíst. Výchozí hodnota je první řádek v zadaném datovém souboru. FIRSTROW je založená na 1.

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

Atribut FIRSTROW není určen k vynechání záhlaví sloupců. Příkaz BULK INSERT nepodporuje přeskakování hlaviček. Pokud se rozhodnete přeskočit řádky, databázový stroj SQL Serveru se podívá jenom na ukončovací volby polí a neověřuje data v polích vynechaných řádků.

LAST ROW

Určuje počet posledního řádku, který se má načíst. Výchozí hodnota je 0, což označuje poslední řádek v zadaném datovém souboru.

DÁVKOVÁ VELIKOST

Určuje počet řádků v dávce. Každá dávka se zkopíruje na server jako jedna transakce. Pokud se to nezdaří, SQL Server potvrdí nebo vrátí transakce zpět pro každou dávku. Ve výchozím nastavení jsou všechna data v zadaném datovém souboru jedna dávka. Informace o aspektech výkonu najdete v části Aspekty výkonu dále v tomto článku.

ZKONTROLUJ_Omezení

Určuje, že všechna omezení cílové tabulky nebo zobrazení musí být kontrolována během operace hromadného importu. CHECK_CONSTRAINTS Bez možnosti se ignorují všechny CHECK a FOREIGN KEY omezení a po operaci je omezení tabulky označeno jako nedůvěryhodné.

UNIQUE a PRIMARY KEY omezení se vždy vynucují. Při importu do sloupce znaků definovaného NOT NULL s omezením vloží prázdný řetězec, BULK INSERT pokud v textovém souboru není žádná hodnota.

V určitém okamžiku je nutné prozkoumat omezení celé tabulky. Pokud byla tabulka před hromadným importem neprázdná, náklady na opětovné ověření omezení můžou překročit náklady na použití CHECK omezení na přírůstková data.

Situace, kdy můžete chtít zakázat omezení (výchozí chování), je situace, kdy vstupní data obsahují řádky, které porušují omezení. Když CHECK jsou omezení zakázaná, můžete data importovat a pak pomocí příkazů Transact-SQL odebrat neplatná data.

Poznámka:

Tato MAXERRORS možnost se nevztahuje na kontrolu omezení.

FIRE_TRIGGERS

Určuje, že všechny triggery vložení definované v cílové tabulce se spustí během operace hromadného importu. Pokud jsou triggery definované pro INSERT operace v cílové tabulce, aktivují se pro každou dokončenou dávku.

Pokud FIRE_TRIGGERS není zadaný, nespustí se žádné triggery vložení.

KEEPIDENTITY

Určuje, že hodnota identity nebo hodnoty v importovaném datovém souboru se použijí pro sloupec identity. Pokud KEEPIDENTITY není zadáno, hodnoty identity pro tento sloupec se ověřují, ale neimportují a SQL Server automaticky přiřadí jedinečné hodnoty na základě počátečních a přírůstkových hodnot zadaných během vytváření tabulky. Pokud datový soubor neobsahuje hodnoty sloupce identity v tabulce nebo zobrazení, použijte formátový soubor k určení, že se sloupec identity v tabulce nebo zobrazení při importu dat přeskočí; SQL Server automaticky přiřadí jedinečné hodnoty pro sloupec. Další informace naleznete v tématu DBCC CHECKIDENT.

Pro více informací viz o uchovávání identifikačních hodnot v článku Uchovávat hodnoty identity při hromadném importu dat.

KEEPNULLS

Určuje, že prázdné sloupce by měly zachovat hodnotu null během operace hromadného importu, místo aby měly žádné výchozí hodnoty pro vložené sloupce. Pro více informací viz Udržet nulové hodnoty nebo výchozí hodnoty během hromadného importu.

KILOBYTES_PER_BATCH

Určuje přibližný počet kilobajtů (kB) dat na dávku jako kilobytes_per_batch. Ve výchozím nastavení je KILOBYTES_PER_BATCH neznámý. Informace o aspektech výkonu najdete v části Aspekty výkonu dále v tomto článku.

ORDER

Určuje způsob řazení dat v datovém souboru. Pokud se importovaná data seřadí podle clusterovaného indexu v tabulce, zlepší se výkon hromadného importu. Pokud je datový soubor seřazený v jiném pořadí, než je pořadí clusterovaného indexového klíče nebo pokud v tabulce není clusterovaný index, ORDER klauzule se ignoruje. Zadané názvy sloupců musí být platné názvy sloupců v cílové tabulce. Ve výchozím nastavení operace hromadného vložení předpokládá, že datový soubor není seřazený. Pro optimalizovaný hromadný import SQL Server také ověří, že jsou importovaná data seřazená.

n je zástupný symbol, který označuje, že je možné zadat více sloupců.

ROWS_PER_BATCH

Určuje přibližný počet řádků dat v datovém souboru.

Ve výchozím nastavení se všechna data v datovém souboru odesílají na server jako jedna transakce a počet řádků v dávce není pro optimalizátor dotazů neznámý. Pokud zadáte ROWS_PER_BATCH (s hodnotou > 0), server tuto hodnotu použije k optimalizaci operace hromadného importu. Hodnota zadaná pro ROWS_PER_BATCH by měla být přibližně stejná jako skutečný počet řádků. Informace o aspektech výkonu najdete v části Aspekty výkonu dále v tomto článku.

TABLOCK

Určuje, že se zámek na úrovni tabulky získá po dobu trvání operace hromadného importu. Tabulku lze načíst souběžně více klienty, pokud tabulka nemá žádné indexy a TABLOCK je určena. Ve výchozím nastavení je chování uzamčení určeno zámkem tabulky možností tabulky při hromadném načtení. Držení zámku po dobu trvání operace hromadného importu snižuje kolize zámků v tabulce, v některých případech může výrazně zvýšit výkon. Informace o aspektech výkonu najdete v části Aspekty výkonu dále v tomto článku.

U indexu columnstore se chování uzamčení liší, protože je interně rozdělené na více sad řádků. Každé vlákno načte data výhradně do každé sady řádků tím, že na sadě řádků vezme výhradní zámek (X), který umožňuje paralelní načítání dat pomocí souběžných relací načítání dat. Použití TABLOCK možnosti způsobí, že vlákno převezme výhradní zámek v tabulce (na rozdíl od zámku bu) hromadné aktualizace (BU) pro tradiční sady řádků), které brání souběžnému načítání dat jinými souběžnými vlákny.

Možnosti formátu vstupního souboru

FORMAT

Platí pro: SQL Server 2017 (14.x) a novější verze.

Určuje soubor hodnot oddělený čárkami vyhovující standardu RFC 4180 .

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

V Fabric Data Warehouse podporuje BULK INSERT příkaz stejné formáty jako samotný COPY INTO výkaz, takže FORMAT = 'PARQUET' je také podporován.

FIELDQUOTE

Platí pro: SQL Server 2017 (14.x) a novější verze.

Určuje znak, který se má použít jako znak uvozovek v souboru CSV. Pokud není zadán, znak uvozovky (") se použije jako znak uvozovek, jak je definováno ve standardu RFC 4180 .

FORMATFILE

Určuje úplnou cestu k souboru formátu. Formátový soubor popisuje datový soubor, který obsahuje uložené odpovědi vytvořené pomocí nástroje bcp ve stejné tabulce nebo zobrazení.

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

Poznámka:

Nahraďte <data-lake>.blob.core.windows.net příslušnou adresou URL.

Formát souboru by se měl použít v následujících případech:

  • Datový soubor obsahuje větší nebo méně sloupců než tabulka nebo zobrazení.
  • Sloupce jsou v jiném pořadí.
  • Oddělovače sloupců se liší.
  • Ve formátu dat jsou další změny. Formátovací soubory se obvykle vytvářejí pomocí nástroje bcp a podle potřeby se upravují pomocí textového editoru. Pro více informací viz bcp Utility a Create a format file with bcp.

Začínaje SQL Server 2017 (14.x) a v Azure SQL Database může být format_file_path v Azure Storage.

FORMATFILE_DATA_SOURCE

Platí pro: SQL Server 2017 (14.x) a novější verze.

Specifikuje pojmenovaný externí zdroj dat, který ukazuje na Azure Storage umístění formátovaného souboru pro definování schématu importovaných dat.

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

Specifikuje terminátor pole, který má být použit pro charwidechar a datové soubory. Výchozí ukončovací znak pole je \t (znak tabulátoru). Další informace naleznete v tématu Zadání ukončovačů polí a řádků.

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

Specifikuje termín řádku, který má být použit pro char a widechar datové soubory.

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

Výchozí termín řádku je \r\n (návrat vozíku a znak nového řádku). Další informace naleznete v tématu Zadání ukončovačů polí a řádků.

Kompatibilita

BULK INSERT vynucuje přísné ověření dat a kontroly dat načtených ze souboru, které by mohly způsobit selhání existujících skriptů při jejich spuštění na neplatných datech. Například ověří, BULK INSERT že:

  • Nativní reprezentace plovoucích nebo skutečných datových typů jsou platné.
  • Data Unicode mají rovnoměrnou délku bajtu.

Datové typy

Převody datových typů typu String-to-Decimal

Převody datových typů typu string-to-decimal se používají BULK INSERT podle stejných pravidel jako funkce Transact-SQL CONVERT , která odmítne řetězce představující číselné hodnoty, které používají vědecký zápis. BULK INSERT Proto zachází s těmito řetězci jako s neplatnými hodnotami a hlásí chyby převodu.

Chcete-li toto chování obejít, použijte formátový soubor k hromadnému importu vědeckých notací s plovoucími daty do desetinného sloupce. Ve formátu souboru explicitně popište sloupec jako skutečná nebo plovoucí data. Další informace o těchto datových typech najdete v tématu float a real.

Formátové soubory představují skutečná data jako datový typ SQLFLT4 a jako datový typ SQLFLT8. Pro informace o souborech bez XML formátu viz Specifikujte typ úložiště souboru pomocí bcp.

Příklad importu číselné hodnoty, která používá vědecký zápis

V tomto příkladu bulktest se v databázi používá následující tabulka:

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

Uživatel chce hromadně importovat data do t_float tabulky. Datový soubor obsahuje C:\t_float-c.datdata s plovoucím vědeckým zápisem, například:

8.0000000000000002E-2 8.0000000000000002E-2

Při kopírování této ukázky mějte na paměti různé textové editory a kódování, které ukládají znaky tabulátoru (\t) jako mezery. Znak tabulátoru se očekává později v této ukázce.

BULK INSERT Tato data ale nelze importovat přímo do t_floatdruhého sloupce, c2protože jeho druhý sloupec používá datový typ desetinné čárky. Proto je nutné formátovat soubor. Formátový soubor musí mapovat data s plovoucím vědeckým zápisem na desetinný formát sloupce c2.

Následující formátový soubor používá datový typ SQLFLT8 k mapování druhého datového pole na druhý sloupec:

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

Chcete-li použít tento formátový soubor (pomocí názvu C:\t_floatformat-c-xml.xmlsouboru) k importu testovacích dat do testovací tabulky, zadejte následující příkaz Transact-SQL:

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

Důležité

Azure SQL Database a Fabric Data Warehouse podporují pouze čtení z URI (například Azure Storage).

Datové typy pro hromadný export nebo import dokumentů SQLXML

K hromadnému exportu nebo importu dat SQLXML použijte jeden z následujících datových typů ve formátu souboru:

Datový typ Účinek
SQLCHAR nebo SQLVARCHAR Data se odesílají ve znakové stránce klienta nebo ve znakové stránce vyplývající z kolace. Efekt je stejný jako určení DATAFILETYPE = 'char' bez zadání formátu souboru.
SQLNCHAR nebo SQLNVARCHAR Data se odesílají jako Unicode. Efekt je stejný jako určení DATAFILETYPE = 'widechar' bez zadání formátu souboru.
SQLBINARY nebo SQLVARBIN Data se odesílají bez jakéhokoli převodu.

Poznámky

Pro srovnání BULK INSERT příkazu, INSERT ... SELECT * FROM OPENROWSET(BULK...) příkazu a bcp příkazu viz Hromadný import a export dat.

Informace o přípravě dat pro hromadný import najdete v tématu Příprava dat pro hromadný export nebo import.

Příkaz BULK INSERT lze provést v rámci uživatelem definované transakce pro import dat do tabulky nebo zobrazení. Volitelně můžete použít více shod pro hromadný import dat, transakce může zadat klauzuli BATCHSIZE v BULK INSERT příkazu. Pokud se vrátí transakce s více dávkami zpět, vrátí se zpět každá dávka, kterou transakce odesílaná na SQL Server vrátí.

Interoperabilita

Import dat ze souboru CSV

Počínaje SQL Serverem 2017 (14.x) BULK INSERT podporuje formát CSV stejně jako Azure SQL Database.

Před sql Serverem 2017 (14.x) nejsou soubory hodnot oddělených čárkami (CSV) podporovány operacemi hromadného importu SQL Serveru. V některých případech se ale soubor CSV dá použít jako datový soubor pro hromadný import dat do SQL Serveru. Informace o požadavcích na import dat z datového souboru CSV najdete v tématu Příprava dat pro hromadný export nebo import.

Chování protokolu

Informace o tom, kdy se do transakčního protokolu zaprotokolují operace vložení řádků prováděné hromadným importem do SQL Serveru, naleznete v tématu Požadavky pro minimální protokolování hromadného importu. Azure SQL Database nepodporuje minimální protokolování.

Omezení

Při použití formátu se souborem BULK INSERTmůžete zadat maximálně 1 024 polí. To je stejné jako maximální počet sloupců povolených v tabulce. Pokud použijete formátový soubor s datovým souborem BULK INSERT , který obsahuje více než 1 024 polí, BULK INSERT vygeneruje se chyba 4822. Nástroj bcp toto omezení nemá, takže pro datové soubory, které obsahují více než 1 024 polí, použijte BULK INSERT bez formátového souboru nebo použijte příkaz bcp .

Důležité informace o výkonu

Pokud počet stránek, které se mají vyprázdnit v jedné dávce, překročí vnitřní prahovou hodnotu, může dojít k úplné kontrole fondu vyrovnávací paměti a zjistit, které stránky se mají vyprázdnit při potvrzení dávky. Tato úplná kontrola může poškodit výkon hromadného importu. K pravděpodobnému překročení vnitřní prahové hodnoty dochází v případě, že se velký fond vyrovnávací paměti zkombinuje s pomalým subsystémem vstupně-výstupních operací. Abyste se vyhnuli přetečení vyrovnávací paměti na velkých počítačích, nepoužívejte nápovědu TABLOCK (která odebere hromadné optimalizace) nebo použijte menší velikost dávky (která zachovává hromadné optimalizace).

Při načítání dat byste měli otestovat různé velikosti dávek, abyste zjistili, co je pro vás nejvhodnější. Mějte na paměti, že velikost dávky má částečný dopad na vrácení zpět. Pokud proces selže a před dalším použitím BULK INSERT budete pravděpodobně muset provést další ruční práci, abyste před selháním odebrali část řádků, které byly úspěšně vloženy.

U služby Azure SQL Database zvažte dočasné zvýšení úrovně výkonu databáze nebo instance před importem, pokud importujete velký objem dat.

Zabezpečení

Delegování účtu zabezpečení (zosobnění)

Pokud uživatel používá přihlášení k SQL Serveru, použije se profil zabezpečení účtu procesu SQL Serveru. Přihlášení pomocí ověřování SQL Serveru nejde ověřit mimo databázový stroj. Proto když BULK INSERT je příkaz inicializován přihlášením pomocí ověřování SQL Serveru, připojení k datům se provádí pomocí kontextu zabezpečení účtu procesu SQL Serveru (účet používaný službou databázového stroje SQL Serveru).

Chcete-li úspěšně číst zdrojová data, musíte účtu, který používá databázový stroj SQL Serveru, udělit přístup ke zdrojovým datům. Pokud se uživatel SQL Serveru přihlásí pomocí ověřování systému Windows, může naopak číst pouze soubory, ke kterým má uživatelský účet přístup bez ohledu na profil zabezpečení procesu SQL Serveru.

Při provádění BULK INSERT příkazu pomocí sqlcmd nebo osql, z jednoho počítače, vložení dat do SQL Serveru na druhém počítači a určení data_file na třetím počítači pomocí cesty UNC může dojít k chybě 4861.

Pokud chcete tuto chybu vyřešit, použijte ověřování SQL Serveru a zadejte přihlášení SQL Serveru, které používá profil zabezpečení účtu procesu SQL Serveru, nebo nakonfigurujte Systém Windows tak, aby povolil delegování účtu zabezpečení. Informace o tom, jak povolit důvěryhodnost uživatelského účtu pro delegování, najdete v nápovědě systému Windows.

Další informace o tomto a dalších aspektech zabezpečení pro použití BULK INSERTnaleznete v tématu Použití funkce BULK INSERT nebo OPENROWSET(BULK...) k importu dat do SQL Serveru.

Když importujete z Azure Storage a data nejsou veřejná (anonymní přístup), vytvořte DATABASE SCOPED CREDENTIAL založený na SAS klíči zašifrovaném hlavním databázovým klíčem (DMK) a poté vytvořte externí databázový zdroj pro použití ve vašem BULK INSERT příkazu.

Případně můžete vytvořit PŘIHLAŠOVACÍ ÚDAJE OBORU DATABÁZE založené na MANAGED IDENTITY autorizaci požadavků na přístup k datům v nepřístupných účtech úložiště. Při použití MANAGED IDENTITYmusí Azure Storage udělit oprávnění spravované identitě instance přidáním vestavěné role řízení přístupu založeného na rolích Azure (RBAC) v rámci Storage Blob Data Contributor , která poskytuje přístup ke čtení/zápisu spravované identitě pro potřebné kontejnery Azure Storage. Spravovaná instance Azure SQL má spravovanou identitu přiřazenou systémem a může mít také jednu nebo více spravovaných identit přiřazených uživatelem. K autorizaci požadavků můžete použít spravované identity přiřazené systémem nebo spravované identity přiřazené uživatelem. Pro autorizaci default by se použila identita spravované instance (to znamená primární spravovaná identita přiřazená uživatelem nebo spravovaná identita přiřazená systémem, pokud není zadaná spravovaná identita přiřazená uživatelem). Pro příklad viz Import dat ze souboru v Azure Storage.

Důležité

Spravovaná identita se vztahuje na Azure SQL a SQL Server 2025 (17.x) a pozdější verze.

Povolení

Následující oprávnění platí pro umístění, kde se data hromadně importují (cíl).

Vyžaduje INSERT a ADMINISTER BULK OPERATIONS má oprávnění. Ve službě Azure SQL Database INSERT jsou ADMINISTER DATABASE BULK OPERATIONS vyžadována oprávnění. ADMINISTER BULK OPERATIONS oprávnění nebo role bulkadmin není pro SQL Server v Linuxu podporovaná. Hromadné vkládání sql Serveru v Linuxu může provádět pouze správce systému Sysadmin .

Oprávnění se navíc vyžaduje v případě, ALTER TABLE že platí jedna nebo více následujících podmínek:

  • Existují omezení a není zadána CHECK_CONSTRAINTS možnost.

    Zakázání omezení je výchozí chování. Pokud chcete explicitně zkontrolovat omezení, použijte tuto CHECK_CONSTRAINTS možnost.

  • Triggery existují a FIRE_TRIGGER možnost není zadaná.

    Ve výchozím nastavení se triggery neaktivují. Pokud chcete aktivovat triggery explicitně, použijte tuto FIRE_TRIGGER možnost.

  • Tuto možnost použijete k importu hodnoty identity z datového KEEPIDENTITY souboru.

Příklady

Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .

Důležité

Azure SQL Database a Fabric Warehouse podporují pouze čtení z Azure Storage.

A. Použití kanálů k importu dat ze souboru

Následující příklad naimportuje podrobné informace o objednávce do AdventureWorks2022.Sales.SalesOrderDetail tabulky ze zadaného datového souboru pomocí svislé roury (|) jako ukončovací znak pole a |\n jako ukončovací znak řádku.

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

B. Použití argumentu FIRE_TRIGGERS

Následující příklad určuje FIRE_TRIGGERS argument.

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

C. Použití odřádkování jako ukončovače řádku

Následující příklad naimportuje soubor, který používá kanál řádku jako ukončovací znak řádku, jako je výstup systému UNIX:

DECLARE @bulk_cmd AS VARCHAR (1000);

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

EXECUTE (@bulk_cmd);

Poznámka:

Ve Windows se \n automaticky nahradí znakem \r\n.

D. Určete znakovou stránku

Následující příklad ukazuje, jak zadat znakovou stránku.

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

E. Import dat ze souboru CSV

Následující příklad ukazuje, jak zadat soubor CSV, přeskočení záhlaví (prvního řádku), použití ; jako ukončovací znak pole a 0x0a jako ukončovací znak řádku:

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

Následující příklad ukazuje, jak zadat soubor CSV ve formátu UTF-8 (pomocí znaku ), CODEPAGE přeskočení záhlaví (prvního řádku), použití 65001 jako ukončovací a ; jako ukončovací znak 0x0ařádku:

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

F. Import dat ze souboru v Azure Storage

Načíst data z CSV v Azure Storage pomocí SAS tokenu

Následující příklad ukazuje, jak načíst data z CSV souboru v Azure Storage, kde jste vytvořili Shared Access Signature (SAS). Místo Azure Storage je nakonfigurováno jako externí zdroj dat, což vyžaduje databázově omezené přihlašovací údaje pomocí SAS klíče, který je v uživatelské databázi zašifrovan pomocí DMK.

Poznámka:

Ujistěte se, že nemáte úvodní ? bod v SAS tokenu, že máte alespoň oprávnění ke čtení objektu, který by měl být načten srt=o&sp=r, a že doba expirace je platná (všechna data jsou v UTC čase).

(Volitelné) DMK není vyžadováno, pokud není DATABASE SCOPED CREDENTIAL vyžadováno, protože blob je nastaven pro veřejný (anonymní) přístup.

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

(Volitelné) A DATABASE SCOPED CREDENTIAL není vyžadováno, protože blob je nastaven pro veřejný (anonymní) přístup.

Nezahrňujte lead ? do SAS tokenu. Ujistěte se, že máte alespoň oprávnění ke čtení objektu, který by měl být načten (srt=o&sp=r), a že doba vypršení platnosti je platná (všechna data jsou v UTC čase).

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

Poznámka:

CREDENTIAL není vyžadováno, pokud je blob nastaven pro veřejný (anonymní) přístup.

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

Načíst data z CSV v Azure Storage s řízenou identitou

Následující příklad ukazuje, jak pomocí příkazu BULK INSERT načíst data z CSV souboru v Azure Storage lokalitě pomocí Managed Identity. Umístění Azure Storage je nakonfigurováno jako externí datový zdroj.

(Volitelné) DMK není vyžadováno, pokud není DATABASE SCOPED CREDENTIAL vyžadováno, protože blob je nastaven pro veřejný (anonymní) přístup.

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

(Volitelné) A DATABASE SCOPED CREDENTIAL není vyžadováno, protože blob je nakonfigurován pro veřejný (anonymní) přístup:

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

Udělit roli Storage Blob Data Contributor, aby zajistil read/write přístup ke spravované identitě pro potřebné Azure Storage kontejnery.

Poznámka:

CREDENTIAL není vyžadováno, pokud je blob nastaven pro veřejný (anonymní) přístup.

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

Důležité

Spravovaná identita platí pro SQL Server 2025 (17.x) a pozdější verze, stejně jako Azure SQL.

G. Importujte data ze souboru v Azure Storage a zadejte chybový soubor

Následující příklad ukazuje, jak načíst data z CSV souboru v Azure Storage, které je nakonfigurováno jako externí zdroj dat, a zároveň specifikuje chybový soubor. Potřebujete přihlašovací údaje s vymezeným oborem databáze pomocí sdíleného přístupového podpisu. Pokud běží na Azure SQL Database, ERRORFILE možnost by měla být doprovázena , ERRORFILE_DATA_SOURCEjinak by import mohl selhat kvůli chybě oprávnění. Soubor zadaný v ERRORFILE kontejneru by neměl existovat.

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

Pro kompletní BULK INSERT příklady včetně konfigurace přihlašovacích údajů a externího zdroje dat viz Příklady hromadného přístupu k datům v Azure Storage.

Další příklady

Další BULK INSERT příklady jsou uvedeny v následujících článcích: