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
azure SQL Managed Instance
Tento článek obsahuje přehled použití příkazu Transact-SQL BULK INSERT
a INSERT...SELECT * FROM OPENROWSET(BULK...)
příkazu k hromadnému importu dat z datového souboru do tabulky SQL Serveru nebo Azure SQL Database.
Tento článek také popisuje aspekty zabezpečení pro použití BULK INSERT
a OPENROWSET(BULK...)
použití těchto metod k hromadnému importu ze vzdáleného zdroje dat.
Příkaz BULK INSERT
BULK INSERT
načte data z datového souboru do tabulky. Tato funkce je podobná té, kterou poskytuje in
možnost bcp
příkazu. Datový soubor však načítá proces SQL Serveru. Popis BULK INSERT
syntaxe naleznete v části BULK INSERT (Transact-SQL).
Příklady BULK INSERT
- Hromadné vložení (Transact-SQL)
- 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 výchozí hodnoty během hromadného importu (SQL Server)
- Specifikace oddělovačů polí a řádků (SQL Server)
- Použití formátu souboru k hromadnému importu dat (SQL Server)
- Použití formátu znaků k importu nebo exportu dat (SQL Server)
- Použití nativního formátu k importu nebo exportu dat (SQL Server)
- Import nebo export dat (SQL Server) pomocí formátu znaků Unicode
- 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 datových souborů (SQL Server) pomocí formátového souboru
Funkce OPENROWSET(BULK...)
K poskytovateli hromadné sady řádků se přistupuje prostřednictvím volání funkce OPENROWSET
a nastavení možnosti OPENROWSET
. Funkce OPENROWSET(BULK...)
umožňuje přístup ke vzdáleným datům připojením ke vzdálenému zdroji dat, jako je datový soubor, prostřednictvím zprostředkovatele dat.
Pokud chcete hromadně importovat data, volejte OPENROWSET(BULK...)
z SELECT...FROM
klauzule v rámci INSERT
příkazu.
Základní syntaxe hromadného importu dat je:
INSERT ... SELECT * FROM OPENROWSET(BULK...)
Při použití v INSERT
příkazu OPENROWSET(BULK...)
podporuje tabulkové nápovědy. Kromě běžných tipů tabulky, jako je TABLOCK
, může klauzule BULK
přijmout následující specializované tipy tabulky:
-
IGNORE_CONSTRAINTS
(ignoruje pouze omezení CHECK) IGNORE_TRIGGERS
KEEPDEFAULTS
KEEPIDENTITY
Další informace naleznete v nápovědě k tabulce (Transact-SQL).
Informace o dalších použití možnosti BULK naleznete v tématu OPENROWSET BULK (Transact-SQL).
vložit... příkaz SELECT * FROM OPENROWSET(BULK...) – příklady
- 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 výchozí hodnoty během hromadného importu (SQL Server)
- Použití formátu souboru k hromadnému importu dat (SQL Server)
- Použití formátu znaků k importu nebo exportu dat (SQL Server)
- přeskočit sloupec tabulky (SQL Server) pomocí formátového souboru
- Použití formátu souboru k přeskočení datového pole (SQL Server)
- Mapování sloupců tabulky na pole datových souborů (SQL Server) pomocí formátového souboru
Důležité informace o zabezpečení
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 inicializován příkaz BULK INSERT
přihlášením s ověřováním SQL Serveru, připojení k datům se provádí pomocí kontextu zabezpečení SQL Server procesního účtu (úč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ředstavte si například uživatele, který se přihlásil k instanci SQL Serveru pomocí ověřování systému Windows. Aby uživatel mohl k importu dat z datového souboru do tabulky SQL Serveru použít funkci BULK INSERT nebo OPENROWSET, vyžaduje uživatelský účet přístup pro čtení k datovému souboru. S přístupem k datovému souboru může uživatel importovat data ze souboru do tabulky, i když proces SQL Serveru nemá oprávnění k přístupu k souboru. Uživatel nemusí udělit oprávnění k přístupu k souborům procesu SQL Serveru.
SQL Server a Microsoft Windows je možné nakonfigurovat tak, aby se instance SYSTÉMU SQL Server mohla připojit k jiné instanci SYSTÉMU SQL Server předáním přihlašovacích údajů ověřeného uživatele systému Windows. Toto uspořádání se označuje jako imitace nebo delegace. Pochopení toho, jak SQL Server nakládá se zabezpečením zosobnění uživatele, je důležité, když používáte BULK INSERT nebo OPENROWSET. Zosobnění uživatele umožňuje, aby se datový soubor nacházel na jiném počítači než proces SQL Serveru nebo uživatel. Pokud má uživatel Computer_A například přístup k datovému souboru na Computer_Ba delegování přihlašovacích údajů bylo správně nastaveno, může se uživatel připojit k instanci SQL Serveru, která běží na Computer_C, přistupovat k datovému souboru na Computer_B, a hromadně importovat data z daného souboru do tabulky v Computer_C.
Hromadný import do SQL Serveru ze vzdáleného datového souboru
Chcete-li použít BULK INSERT
nebo INSERT...SELECT * FROM OPENROWSET(BULK...)
hromadně importovat data z jiného počítače, musí být datový soubor sdílen mezi těmito dvěma počítači. Chcete-li zadat sdílený datový soubor, použijte název UNC (Universal Naming Convention), který má obecný tvar . \\Servername\Sharename\Path\Filename
Účet použitý pro přístup k datovému souboru navíc musí mít oprávnění požadovaná ke čtení souboru na vzdáleném disku.
Například následující příkaz BULK INSERT
hromadně importuje data do tabulky SalesOrderDetail
databáze AdventureWorks
z datového souboru s názvem newdata.txt
. Tento datový soubor se nachází ve sdílené složce s názvem \dailyorders
v adresáři síťové sdílené složky s názvem salesforce
v systému s názvem computer2
.
BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM '\\computer2\salesforce\dailyorders\neworders.txt';
Poznámka
Toto omezení neplatí pro bcp
nástroj, protože klient čte soubor nezávisle na SQL Serveru.
Hromadný import ze služby Azure Blob Storage
Při importu z Úložiště objektů Blob v Azure, pokud data nejsou veřejná (anonymní přístup), vytvořte CREATE DATABASE SCOPED CREDENTIAL na základě klíče SAS, který je šifrovaný pomocí CREATE MASTER KEY, a pak vytvořte externí zdroj databáze pro použití ve vašem BULK INSERT
příkazu.
Případně vytvořte CREATE DATABASE SCOPED CREDENTIAL na základě MANAGED IDENTITY
, aby se autorizovaly žádosti o přístup k datům ve neveřejný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 by se použila default
identita spravované instance (to je 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).
Důležitý
Spravovaná identita není podporována ve verzích SQL Serveru před SQL Serverem 2025.
Poznámka
Nepoužívejte explicitní transakci nebo se zobrazí chyba 4861.
Použijte BULK INSERT
Následující příklad ukazuje, jak pomocí BULK INSERT
příkazu načíst data ze souboru CSV do umístění úložiště objektů blob v Azure, na kterém jste vytvořili klíč SAS. Umístění úložiště objektů blob v Azure je nakonfigurované jako externí zdroj dat. To vyžaduje přihlašovací údaje s oborem databáze pomocí sdíleného přístupového podpisu, 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 načíst data ze souboru CSV, který je uložen v úložišti objektů blob v Azure, pomocí příkazu BULK INSERT
a 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ý
Azure SQL Database nepodporuje čtení ze souborů Windows.
Použití OPENROWSET
Následující příklad ukazuje, jak pomocí OPENROWSET
příkazu načíst data ze souboru CSV do umístění úložiště objektů blob v Azure, na kterém jste vytvořili klíč SAS. Umístění úložiště objektů blob v Azure je nakonfigurované jako externí zdroj dat. To vyžaduje přihlašovací údaje s oborem databáze pomocí sdíleného přístupového podpisu, 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!
);
INSERT INTO achievements with (TABLOCK) (id, description)
SELECT * FROM OPENROWSET(
BULK 'csv/achievements.csv',
DATA_SOURCE = 'MyAzureBlobStorage',
FORMAT ='CSV',
FORMATFILE='csv/achievements-c.xml',
FORMATFILE_DATA_SOURCE = 'MyAzureBlobStorage'
) AS DataFile;
Důležitý
Azure SQL Database nepodporuje čtení ze souborů Windows.
Související obsah
- INSERT (Transact-SQL)
- klauzule SELECT (Transact-SQL)
- hromadný import a export dat (SQL Server)
- OPENROWSET (Transact-SQL)
- SELECT (Transact-SQL)
- Klauzule FROM plus JOIN, APPLY, PIVOT (Transact-SQL)
- nástroj bcp
- Hromadné vložení (Transact-SQL)