Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná 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.
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' | '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 ]
)]
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 |
Ověření zdroje | Ověřování systému Windows, SAS | Microsoft Entra ID, token SAS, spravovaná identita | Microsoft Entra ID |
Nepodporované možnosti |
* zástupné cardy v cestě |
* zástupné cardy v cestě |
DATA_SOURCE , FORMATFILE_DATA_SOURCE , , ERRORFILE ERRORFILE_DATA_SOURCE |
Povolené možnosti, ale bez efektu |
KEEPIDENTITY , FIRE_TRIGGERS , , CHECK_CONSTRAINTS TABLOCK , ORDER , ROWS_PER_BATCH , , KILOBYTES_PER_BATCH a BATCHSIZE nejsou použitelné. Nevyvolají chybu syntaxe, ale nebudou mít žá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 načítání dat do zobrazení naleznete v tématu INSERT (Transact-SQL).
Z 'data_file'
Určuje úplnou cestu k datovému souboru, který obsahuje data pro import do zadané tabulky nebo zobrazení. FUNKCE BULK INSERT může importovat data z disku nebo služby Azure Blob Storage (včetně sítě, diskety, pevného disku atd.).
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 Warehouse podporují jen čtení ze služby Azure Blob Storage.
Počínaje SQL Serverem 2017 (14.x) může být data_file ve službě Azure Blob Storage. V takovém případě musíte také zadat data_source_name
možnost. Příklad najdete v tématu Import dat ze souboru ve službě Azure Blob Storage.
Fabric 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 Warehouse podporuje *
zástupné znaky, které můžou odpovídat libovolnému znaku v identifikátoru URI, a umožňuje definovat vzor identifikátoru URI pro soubory, které by se měly importovat. 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.
BATCHSIZE = batch_size
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. Bez možnosti CHECK_CONSTRAINTS se všechna omezení CHECK a FOREIGN KEY ignorují a po operaci je omezení tabulky označeno jako nedůvěryhodné.
Omezení UNIQUE a PRIMARY KEY se vždy vynucují. Při importu do sloupce znaků definovaného s omezením NOT NULL vloží funkce BULK INSERT prázdný řetězec, 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í mohou překročit náklady na použití omezení CHECK 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í. Pokud jsou omezení CHECK zakázaná, můžete data importovat a pak pomocí příkazů Transact-SQL odebrat neplatná data.
Poznámka:
Možnost MAXERRORS se nevztahuje na kontrolu omezení.
CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' }
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 než 127 nebo menší než 32. Příklad najdete v tématu Zadání znakové stránky.
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'
WITH (CODEPAGE = '65001', FIRSTROW=2);
Poznámka:
Nahraďte <data-lake>.blob.core.windows.net
příslušnou adresou URL.
CodePAGE není podporovaná možnost v Linuxu pro SQL Server 2017 (14.x). Pro SQL Server 2019 (15.x) je povolena pouze možnost RAW pro CODEPAGE.
Pro každý sloupec ve formátu souboru byste měli zadat název kolace.
Hodnota CODEPAGE | Popis |
---|---|
AKT | 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é znakové stránky OEM na znakovou stránku SQL Serveru. |
Surový | 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 starší než SQL Server 2016 (13.x) nepodporují kódovou stránku 65001 (kódování UTF-8). |
DATAFILETYPE = { 'char' | 'native' | "widechar" | "rozšiřující" }
Určuje, že funkce BULK INSERT provede operaci importu pomocí zadané hodnoty typu datového souboru.
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'
WITH (DATAFILETYPE = 'char', FIRSTROW=2);
Poznámka:
Nahraďte <data-lake>.blob.core.windows.net
příslušnou adresou URL.
Hodnota DATAFILETYPE | Všechna data reprezentovaná v: |
---|---|
char (výchozí) | Formát znaků. Další informace naleznete v tématu Použití formátu znaku k importu nebo exportu dat (SQL Server). |
rodák | 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). Další informace naleznete v tématu Použití nativního formátu k importu nebo exportu dat (SQL Server). |
widechar | Znaky Unicode Další informace naleznete v tématu Použití formátu znaku Unicode k importu nebo exportu dat (SQL Server). |
rozšiřující | Nativní datové typy (databáze), s výjimkou znaků, varchar a textových sloupců, ve kterých jsou data uložena jako Unicode. Vytvořte rozšiřující datový soubor hromadným importem dat z SQL Serveru pomocí nástroje bcp . Rozšiřující hodnota nabízí vyšší výkonovou alternativu k widecharu. Pokud datový soubor obsahuje rozšířené znaky ANSI, zadejte rozšiřující. Další informace najdete v tématu Použití nativního formátu Unicode k importu nebo exportu dat (SQL Server). |
DATA_SOURCE = 'data_source_name'
Platí pro: SQL Server 2017 (14.x) a Azure SQL Database.
Určuje pojmenovaný externí zdroj dat odkazující na umístění azure Blob Storage souboru, který se naimportuje. Externí zdroj dat musí být vytvořen pomocí TYPE = BLOB_STORAGE
možnosti přidané v SQL Serveru 2017 (14.x). Další informace naleznete v tématu CREATE EXTERNAL DATA SOURCE. Příklad najdete v tématu Import dat ze souboru ve službě Azure Blob Storage.
Poznámka:
Nahraďte <data-lake>.blob.core.windows.net
příslušnou adresou URL.
CREATE EXTERNAL DATA SOURCE pandemicdatalake
WITH (LOCATION='https://<data-lake>.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='<data-lake>',FIRSTROW = 2,LASTROW = 100,FIELDTERMINATOR = ',');
ERRORFILE = 'error_file_path'
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.
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.
Počínaje SQL Serverem 2017 (14.x) může být error_file_path ve službě Azure Blob Storage.
ERRORFILE_DATA_SOURCE = 'errorfile_data_source_name'
Platí pro: SQL Server 2017 (14.x).
Určuje pojmenovaný externí zdroj dat odkazující na umístění azure Blob Storage chybového souboru, který bude obsahovat chyby zjištěné během importu. Externí zdroj dat musí být vytvořen pomocí TYPE = BLOB_STORAGE
možnosti přidané v SQL Serveru 2017 (14.x). Další informace naleznete v tématu CREATE EXTERNAL DATA SOURCE.
FIRSTROW = first_row
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 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (FIRSTROW=2);
Poznámka:
Nahraďte <data-lake>.blob.core.windows.net
příslušnou adresou URL.
Atribut FIRSTROW není určen k vynechání záhlaví sloupců. Příkaz BULK INSERT nepodporuje přeskočení 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ů.
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 operace INSERT v cílové tabulce, aktivují se pro každou dokončenou dávku.
Pokud není zadaný FIRE_TRIGGERS, nespustí se žádné triggery pro vložení.
FORMATFILE_DATA_SOURCE = "data_source_name"
Platí pro: SQL Server 2017 (14.x).
Určuje pojmenovaný externí zdroj dat odkazující na umístění služby Azure Blob Storage ve formátu souboru, který definuje schéma importovaných dat. Externí zdroj dat musí být vytvořen pomocí TYPE = BLOB_STORAGE
možnosti přidané v SQL Serveru 2017 (14.x). Další informace naleznete v tématu CREATE EXTERNAL DATA SOURCE.
KEEPIDENTITY
Určuje, že hodnota identity nebo hodnoty v importovaném datovém souboru se použijí pro sloupec identity. Pokud není zadán parametr KEEPIDENTITY, 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 (Transact-SQL).
Další informace najdete v tématu Zachování hodnot identifikace v tématu Zachovat hodnoty identity při hromadném importu dat (SQL Server).
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. Další informace najdete v tématu Zachování hodnot Null nebo použití výchozích hodnot při hromadném importu (SQL Server).
KILOBYTES_PER_BATCH = 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.
LASTROW = 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.
MAXERRORS = max_errors
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.
Možnost MAX_ERRORS se nevztahuje na kontroly omezení ani na převod peněz a datových typů bigint .
ORDER ( { sloupec [ ASC | DESC ] } [ ,... n ] )
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 = 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 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 může načíst současně více klientů, pokud tabulka nemá žádné indexy a tabLOCK je určen. 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 zámek X, který umožňuje paralelní načítání dat pomocí souběžných relací načítání dat. Použití možnosti TABLOCK způsobí, že vlákno převezme zámek X v tabulce (na rozdíl od zámku BU pro tradiční sady řádků), což zabrání souběžnému načítání dat jinými souběžnými vlákny.
Možnosti formátu vstupního souboru
FORMAT = 'CSV'
Platí pro: SQL Server 2017 (14.x).
Určuje soubor hodnot oddělený čárkami vyhovující standardu RFC 4180 .
BULK INSERT Sales.Orders
FROM '\\SystemX\DiskZ\Sales\data\orders.csv'
WITH ( FORMAT = 'CSV');
FIELDQUOTE = 'field_quote'
Platí pro: SQL Server 2017 (14.x).
Určuje znak, který se použije jako znak uvozovek v souboru CSV. Pokud není zadán, znak uvozovky (") se použije jako znak uvozovek definovaný ve standardu RFC 4180 .
FORMATFILE = 'format_file_path'
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í. 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. Další informace naleznete v nástroji bcp a vytvoření formátu souboru.
Počínaje SQL Serverem 2017 (14.x) a ve službě Azure SQL Database format_file_path
může být ve službě Azure Blob Storage.
FIELDTERMINATOR = 'field_terminator'
Určuje ukončovací znak pole, který se má použít pro znak a widechar datových souborů. Výchozí ukončovací znak pole je \t
(znak tabulátoru). Další informace naleznete v tématu Specifikace ukončovačů políček a řádků (SQL Server).
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'
WITH (FIELDTERMINATOR = ',', FIRSTROW=2);
Poznámka:
Nahraďte <data-lake>.blob.core.windows.net
příslušnou adresou URL.
ROWTERMINATOR = 'row_terminator'
Určuje ukončovací znak řádku, který se má použít pro znakové a širokoúhlé datových souborů. Výchozí ukončovací znak řádku je \r\n
(znak nového řádku). Další informace naleznete v tématu Specifikace ukončovačů políček a řádků (SQL Server).
Kompatibilita
FUNKCE 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 FUNKCE BULK INSERT ověří, ž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ého typu typu typu string-to-decimal použité v BULK INSERT se řídí stejnými pravidly jako funkce Transact-SQL CONVERT , která odmítne řetězce představující číselné hodnoty, které používají vědecký zápis. Funkce BULK INSERT proto zpracovává takové řetězce jako neplatné hodnoty 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 části float a real (Transact-SQL).
Formátové soubory představují skutečná data jako datový typ SQLFLT4 a jako datový typ SQLFLT8. Informace o formátových souborech bez XML naleznete v tématu Určení typu úložiště souborů pomocí bcp (SQL Server).
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 C:\t_float-c.dat obsahuje vědecké notace s plovoucími daty; 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.
FUNKCE BULK INSERT však nemůže importovat tato data přímo do t_float
svého druhého sloupce, c2
protože tento datový typ používá decimal
. 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á SQLFLT8
datový typ 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.xml
souboru) 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 podporuje jen čtení ze služby Azure Blob 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
Porovnání příkazu BULK INSERT, INSERT ... SELECT * FROM OPENROWSET(BULK...)
příkazu a bcp
příkazu naleznete v tématu Hromadný import a export dat.
Informace o přípravě dat pro hromadný import naleznete 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í. Pokud chcete pro hromadný import dat použít více shod, transakce může v příkazu BULK INSERT zadat klauzuli BATCHSIZE. Pokud se vrátí transakce s více dávkami zpět, vrátí se zpět každá dávka, kterou transakce odeslala na SQL Server.
Interoperabilita
Import dat ze souboru CSV
Počínaje SQL Serverem 2017 (14.x) podporuje funkce BULK INSERT 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 (SQL Server).
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 souboru s hromadným vložením můžete zadat maximálně 1024 polí. To je stejné jako maximální počet sloupců povolených v tabulce. Pokud použijete formátový soubor s funkcí BULK INSERT s datovým souborem, který obsahuje více než 1024 polí, funkce BULK INSERT vygeneruje chybu 4822. Nástroj bcp toto omezení nemá, takže pro datové soubory, které obsahují více než 1024 polí, použijte funkci 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 buď 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 opětovným použitím funkce BULK INSERT bude pravděpodobně nutné 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.
Bezpečnost
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ž je příkaz BULK INSERT 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).
Abyste mohli úspěšně číst zdrojová data, musíte účtu používanému databázovým strojem 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í příkazu BULK INSERT 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í při použití funkce BULK INSERT naleznete v tématu Import hromadných dat pomocí funkce BULK INSERT nebo OPENROWSET(BULK...) (SQL Server).
Při importu ze služby Azure Blob Storage a data nejsou veřejná (anonymní přístup), vytvořte přihlašovací údaje s oborem databáze založené na klíči SAS zašifrovaném pomocí hlavního klíče a pak vytvořte externí zdroj databáze pro použití v příkazu BULK INSERT.
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 IDENTITY
musí úložiště Azure udělit oprávnění spravované identitě instance přidáním integrované role Správce objektů blob služby v rámci řízení přístupu na základě rolí (RBAC), která poskytuje přístup pro čtení a zápis ke spravované identitě pro potřebné kontejnery služby Azure Blob 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 je primární spravovaná identita přiřazená uživatelem nebo spravovaná identita přiřazená systémem, pokud není zadána spravovaná identita přiřazená uživatelem). Příklad najdete v tématu Import dat ze souboru ve službě Azure Blob Storage.
Důležité
Spravovaná identita se vztahuje pouze na Azure SQL. SQL Server nepodporuje spravovanou identitu.
Povolení
Vyžaduje oprávnění K VLOŽENÍ a SPRÁVĚ HROMADNÝCH OPERACÍ. Ve službě Azure SQL Database jsou vyžadována oprávnění PRO VLOŽENÍ a SPRÁVU HROMADNÝCH OPERACÍ DATABÁZE. SPRÁVA oprávnění BULK OPERATIONS 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 .
Kromě toho se vyžaduje oprávnění ALTER TABLE, pokud platí jedna nebo více následujících podmínek:
Existují omezení a není zadána možnost CHECK_CONSTRAINTS.
Zakázání omezení je výchozí chování. Pokud chcete explicitně zkontrolovat omezení, použijte možnost CHECK_CONSTRAINTS.
Triggery existují a není zadána možnost FIRE_TRIGGER.
Ve výchozím nastavení se triggery neaktivují. K explicitní aktivaci triggerů použijte možnost FIRE_TRIGGER.
K importu hodnoty identity z datového souboru použijete možnost KEEPIDENTITY.
Příklady
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'
);
Důležité
Azure SQL Database podporuje jen čtení ze služby Azure Blob Storage.
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
);
Důležité
Azure SQL Database podporuje jen čtení ze služby Azure Blob Storage.
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 VARCHAR(1000);
SET @bulk_cmd = 'BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>''
WITH (ROWTERMINATOR = '''+CHAR(10)+''')';
EXEC(@bulk_cmd);
Poznámka:
Vzhledem ke způsobu, jakým Systém Microsoft Windows pracuje s textovými soubory, \n
je automaticky nahrazen .\r\n
Důležité
Azure SQL Database podporuje jen čtení ze služby Azure Blob Storage.
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 = ','
);
Důležité
Azure SQL Database podporuje jen čtení ze služby Azure Blob Storage.
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');
Důležité
Azure SQL Database podporuje jen čtení ze služby Azure Blob Storage.
F. Import dat ze souboru ve službě Azure Blob Storage
Následující příklad ukazuje, jak načíst data ze souboru CSV v umístění služby Azure Blob Storage, ve kterém jste vytvořili sdílený přístupový podpis (SAS). Umístění služby Azure Blob Storage je nakonfigurované jako externí zdroj dat, který vyžaduje přihlašovací údaje s oborem databáze pomocí klíče SAS, který je šifrovaný pomocí hlavního klíče v uživatelské databázi.
--> 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');
Následující příklad ukazuje, jak pomocí příkazu BULK INSERT načíst data ze souboru CSV do umístění úložiště objektů blob v Azure pomocí spravované identity. Umístění úložiště objektů blob v Azure je nakonfigurované jako externí zdroj dat.
--> 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');
Důležité
Spravovaná identita se vztahuje pouze na Azure SQL. SQL Server nepodporuje spravovanou identitu.
Důležité
Azure SQL podporuje čtení jenom ze služby Azure Blob Storage.
G. Import dat ze souboru ve službě Azure Blob Storage a zadání chybového souboru
Následující příklad ukazuje, jak načíst data ze souboru CSV v umístění služby Azure Blob Storage, který je nakonfigurovaný jako externí zdroj dat, a také zadat chybový soubor. Budete potřebovat přihlašovací údaje s vymezeným oborem databáze pomocí sdíleného přístupového podpisu. Pokud běží ve službě Azure SQL Database, měla by být k dispozici možnost ERRORFILE ERRORFILE_DATA_SOURCE jinak může import selhat s chybou oprávnění. Soubor zadaný v souboru ERRORFILE by neměl v kontejneru existovat.
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (
DATA_SOURCE = 'MyAzureInvoices'
, FORMAT = 'CSV'
, ERRORFILE = 'MyErrorFile'
, ERRORFILE_DATA_SOURCE = 'MyAzureInvoices');
Kompletní BULK INSERT
příklady, včetně konfigurace přihlašovacích údajů a externího zdroje dat, najdete v tématu Příklady hromadného přístupu k datům ve službě Azure Blob Storage.
Další příklady
Další BULK INSERT
příklady jsou uvedeny v následujících článcích:
- příklady hromadného importu a exportu dokumentů XML (SQL Server)
- zachovat hodnoty identity při hromadném importu dat (SQL Server)
- zachovat hodnoty null nebo použít výchozí hodnoty při hromadném importu (SQL Server)
- Specifikace terminátorů polí a řádků (SQL Server)
- použití formátu souboru k hromadnému importu dat (SQL Server)
- použití formátu znaku k importu nebo exportu dat (SQL Server)
- Použijte nativní formát k importu nebo exportu dat (SQL Server)
- Použijte formát znaků Unicode k importu nebo exportu dat (SQL Server)
- Použijte nativní formát Unicode k importu nebo exportu dat (SQL Server)
- přeskočit sloupec tabulky (SQL Server) pomocí formátového souboru
- Mapování sloupců tabulky na pole Data-File (SQL Server) pomocí formátového souboru