Sdílet prostřednictvím


Import dat do SQL Serveru pomocí funkce BULK INSERT nebo OPENROWSET(BULK...)

platí pro:SQL ServerAzure SQL Databaseazure 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

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

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 IDENTITYmusí ú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.