Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Dit artikel bevat een overzicht van het gebruik van de Transact-SQL-instructie BULK INSERT
en de INSERT...SELECT * FROM OPENROWSET(BULK...)
instructie voor het bulksgewijs importeren van gegevens uit een gegevensbestand in een SQL Server- of Azure SQL Database-tabel.
In dit artikel worden ook beveiligingsoverwegingen beschreven voor het gebruik BULK INSERT
en OPENROWSET(BULK...)
en het gebruik van deze methoden om bulksgewijs te importeren vanuit een externe gegevensbron.
BULK INSERT-instructie
BULK INSERT
laadt gegevens uit een gegevensbestand in een tabel. Deze functionaliteit is vergelijkbaar met die van de in
optie van de bcp
opdracht. Het gegevensbestand wordt echter gelezen door het SQL Server-proces. Zie BULK INSERT
voor een beschrijving van de syntaxis.
VOORBEELDEN VAN BULK INSERT
- BULK INSERT (Transact-SQL)
- Voorbeelden van bulksgewijs importeren en exporteren van XML-documenten (SQL Server)
- Identiteitswaarden behouden bij het bulksgewijs importeren van gegevens (SQL Server)
- Null-waarden of standaardwaarden behouden tijdens het bulksgewijs importeren (SQL Server)
- veld- en rijeindtekens (SQL Server) opgeven
- Een indelingsbestand gebruiken om gegevens bulksgewijs te importeren (SQL Server)
- Tekenindeling gebruiken om gegevens (SQL Server) te importeren of te exporteren
- Systeemeigen indeling gebruiken voor het importeren of exporteren van gegevens (SQL Server)
- Unicode-tekenindeling gebruiken om gegevens (SQL Server) te importeren of te exporteren
- Unicode Native Format gebruiken voor het importeren of exporteren van gegevens (SQL Server)
- Een indelingsbestand gebruiken om een tabelkolom (SQL Server) over te slaan
- Een indelingsbestand gebruiken om tabelkolommen toe te wijzen aan gegevensbestandsvelden (SQL Server)
OPENROWSET(BULK...) Functie
De OPENROWSET
provider voor bulkrijsets wordt geopend door de OPENROWSET
functie aan te roepen en de BULK
optie op te geven. Met de OPENROWSET(BULK...)
functie kunt u toegang krijgen tot externe gegevens door via een gegevensprovider verbinding te maken met een externe gegevensbron, zoals een gegevensbestand.
Als u gegevens bulksgewijs wilt importeren, roept u OPENROWSET(BULK...)
aan vanuit een SELECT...FROM
component in de INSERT
instructie.
De basissyntaxis voor het bulksgewijs importeren van gegevens is:
INSERT ... SELECT * FROM OPENROWSET(BULK...)
Bij gebruik in een INSERT
instructie ondersteunt OPENROWSET(BULK...)
tabelhints. Naast de reguliere tabelhints, zoals TABLOCK
, kan de BULK
component de volgende gespecialiseerde tabelhints accepteren:
-
IGNORE_CONSTRAINTS
(negeert alleen de CHECK-beperkingen) IGNORE_TRIGGERS
KEEPDEFAULTS
KEEPIDENTITY
Zie Tabelhints (Transact-SQL) voor meer informatie.
Zie OPENROWSET BULK (Transact-SQL) voor meer informatie over aanvullende toepassingen van de optie BULK.
INVOEGEN... SELECT * FROM OPENROWSET(BULK...)-instructies - voorbeelden
- Voorbeelden van bulksgewijs importeren en exporteren van XML-documenten (SQL Server)
- Identiteitswaarden behouden bij het bulksgewijs importeren van gegevens (SQL Server)
- Null-waarden of standaardwaarden behouden tijdens het bulksgewijs importeren (SQL Server)
- Een indelingsbestand gebruiken om gegevens bulksgewijs te importeren (SQL Server)
- Tekenindeling gebruiken om gegevens (SQL Server) te importeren of te exporteren
- Een indelingsbestand gebruiken om een tabelkolom (SQL Server) over te slaan
- Een indelingsbestand gebruiken om een gegevensveld (SQL Server) over te slaan
- Een indelingsbestand gebruiken om tabelkolommen toe te wijzen aan gegevensbestandsvelden (SQL Server)
Beveiligingsoverwegingen
Als een gebruiker een SQL Server-aanmelding gebruikt, wordt het beveiligingsprofiel van het SQL Server-procesaccount gebruikt. Een aanmelding met SQL Server-authenticatie kan niet worden geverifieerd buiten de Database Engine. Wanneer een BULK INSERT
opdracht wordt gestart door een aanmelding met behulp van SQL Server-verificatie, wordt de verbinding met de gegevens gemaakt met behulp van de beveiligingscontext van het SQL Server-procesaccount (het account dat wordt gebruikt door de SQL Server Database Engine-service).
Als u de brongegevens wilt lezen, moet u het account dat door de SQL Server Database Engine wordt gebruikt, toegang verlenen tot de brongegevens. Als een SQL Server-gebruiker zich daarentegen aanmeldt met Windows-verificatie, kan de gebruiker alleen de bestanden lezen die toegankelijk zijn voor het gebruikersaccount, ongeacht het beveiligingsprofiel van het SQL Server-proces.
Denk bijvoorbeeld aan een gebruiker die zich heeft aangemeld bij een exemplaar van SQL Server met behulp van Windows-verificatie. Als de gebruiker BULK INSERT of OPENROWSET kan gebruiken om gegevens uit een gegevensbestand te importeren in een SQL Server-tabel, heeft het gebruikersaccount leestoegang tot het gegevensbestand nodig. Met toegang tot het gegevensbestand kan de gebruiker gegevens uit het bestand importeren in een tabel, zelfs als het SQL Server-proces geen toegang heeft tot het bestand. De gebruiker hoeft geen machtiging voor bestandstoegang te verlenen voor het SQL Server-proces.
SQL Server en Microsoft Windows kunnen zo worden geconfigureerd dat een exemplaar van SQL Server verbinding kan maken met een ander exemplaar van SQL Server door de referenties van een geverifieerde Windows-gebruiker door te sturen. Deze regeling staat bekend als imitatie of delegering. Inzicht in hoe SQL Server-versies de beveiliging afhandelen voor gebruikersimitatie is belangrijk wanneer u BULK INSERT of OPENROWSET gebruikt. Door gebruikersimitatie kan het gegevensbestand zich op een andere computer bevinden dan het SQL Server-proces of de gebruiker. Als een gebruiker op Computer_A bijvoorbeeld toegang heeft tot een gegevensbestand op Computer_Ben de overdracht van referenties op de juiste manier is ingesteld, kan de gebruiker verbinding maken met een exemplaar van SQL Server dat wordt uitgevoerd op Computer_C, toegang tot het gegevensbestand op Computer_B, en gegevens uit dat bestand bulksgewijs importeren in een tabel op Computer_C.
Bulksgewijs importeren naar SQL Server vanuit een extern gegevensbestand
Als u gegevens van een andere computer wilt gebruiken BULK INSERT
of INSERT...SELECT * FROM OPENROWSET(BULK...)
bulksgewijs wilt importeren, moet het gegevensbestand worden gedeeld tussen de twee computers. Als u een gedeeld gegevensbestand wilt opgeven, gebruikt u de naam van de UNC (Universal Naming Convention), die de algemene vorm heeft. \\Servername\Sharename\Path\Filename
Daarnaast moet het account dat wordt gebruikt voor toegang tot het gegevensbestand beschikken over de machtigingen die vereist zijn voor het lezen van het bestand op de externe schijf.
Met de volgende BULK INSERT
instructie worden gegevens bijvoorbeeld bulksgewijs geïmporteerd in de SalesOrderDetail
tabel van de AdventureWorks
-database uit een gegevensbestand met de naam newdata.txt
. Dit gegevensbestand bevindt zich in een gedeelde map met de naam \dailyorders
in een netwerksharemap met de naam salesforce
op een systeem met de naam computer2
.
BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM '\\computer2\salesforce\dailyorders\neworders.txt';
Notitie
Deze beperking is niet van toepassing op het bcp
hulpprogramma omdat de client het bestand onafhankelijk van SQL Server leest.
Bulksgewijs importeren vanuit Azure Blob Storage
Wanneer u importeert vanuit Azure Blob Storage en de gegevens niet openbaar zijn (anonieme toegang), maakt u een CREATE DATABASE SCOPED CREDENTIAL op basis van een SAS-sleutel die is versleuteld met een CREATE MASTER KEY en maakt u vervolgens een externe databasebron voor gebruik in uw BULK INSERT
opdracht.
U kunt ook een CREATE DATABASE SCOPED CREDENTIAL maken op basis van MANAGED IDENTITY
om aanvragen voor gegevenstoegang in niet-openbare opslagaccounts te autoriseren. Wanneer u MANAGED IDENTITY
gebruikt, moet Azure Storage machtigingen aan de beheerde identiteit van het exemplaar geven door de ingebouwde Azure-rol Storage Blob Data Contributor toe te voegen, die lees-/schrijftoegang biedt aan deze beheerde identiteit voor de benodigde Azure Blob Storage-containers. Azure SQL Managed Instance heeft een door het systeem toegewezen beheerde identiteit en kan ook een of meer door de gebruiker toegewezen beheerde identiteiten hebben. U kunt door het systeem toegewezen beheerde identiteiten of door de gebruiker toegewezen beheerde identiteiten gebruiken om de aanvragen te autoriseren. Voor autorisatie wordt de default
identiteit van het beheerde exemplaar gebruikt (dat is de primaire door de gebruiker toegewezen beheerde identiteit of door het systeem toegewezen beheerde identiteit als door de gebruiker toegewezen beheerde identiteit niet is opgegeven).
Belangrijk
Beheerde identiteit wordt niet ondersteund in SQL Server-versies vóór SQL Server 2025.
Notitie
Gebruik geen expliciete transactie of u ontvangt een 4861-fout.
BULK INSERT gebruiken
In het volgende voorbeeld ziet u hoe u de BULK INSERT
opdracht gebruikt om gegevens uit een CSV-bestand te laden in een Azure Blob Storage-locatie waarop u een SAS-sleutel hebt gemaakt. De Azure Blob Storage-locatie is geconfigureerd als een externe gegevensbron. Hiervoor is een database-gerichte referentie vereist met behulp van een gedeelde toegangssignatuur die is versleuteld met een hoofdsleutel in de gebruikersdatabase.
--> 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');
In het volgende voorbeeld ziet u hoe u de BULK INSERT
opdracht gebruikt om gegevens uit een CSV-bestand in een Azure Blob Storage-locatie te laden met behulp van beheerde identiteit. De Azure Blob Storage-locatie is geconfigureerd als een externe gegevensbron.
--> 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');
Belangrijk
Azure SQL Database biedt geen ondersteuning voor het lezen van Windows-bestanden.
OPENROWSET gebruiken
In het volgende voorbeeld ziet u hoe u de OPENROWSET
opdracht gebruikt om gegevens uit een CSV-bestand te laden in een Azure Blob Storage-locatie waarop u een SAS-sleutel hebt gemaakt. De Azure Blob Storage-locatie is geconfigureerd als een externe gegevensbron. Hiervoor is een database-gerichte referentie vereist met behulp van een gedeelde toegangssignatuur die is versleuteld met een hoofdsleutel in de gebruikersdatabase.
--> 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;
Belangrijk
Azure SQL Database biedt geen ondersteuning voor het lezen van Windows-bestanden.
Verwante inhoud
- INSERT (Transact-SQL)
- SELECT-clause (Transact-SQL)
- bulksgewijs importeren en exporteren van gegevens (SQL Server)
- OPENROWSET (Transact-SQL)
- SELECT (Transact-SQL)
- FROM-clausule plus JOIN, APPLY, PIVOT (Transact-SQL)
- bcp Hulpprogramma
- BULK INSERT (Transact-SQL)