Delen via


Voorbeelden van bulktoegang tot gegevens in Azure Blob Storage

van toepassing op: SQL Server 2017 (14.x) en hoger Azure SQL DatabaseAzure SQL Managed Instance

De instructies BULK INSERT en OPENROWSET hebben rechtstreeks toegang tot een bestand in Azure Blob Storage. In de volgende voorbeelden worden gegevens uit een CSV-bestand (door komma's gescheiden waarden) (met de naam inv-2017-01-19.csv), opgeslagen in een container (met de naam Week3), opgeslagen in een opslagaccount (met de naam newinvoices).

Alle paden naar de container en naar de bestanden op Blob Storage zijn hoofdlettergevoelig. Als dit niet juist is, kan er een fout worden teruggegeven zoals in het volgende voorbeeld:

Kan niet bulksgewijs laden. Het bestandfile.csvbestaat niet of u hebt geen rechten voor bestandstoegang.

De inloggegevens aanmaken

De externe gegevensbron moet worden gemaakt met een databasereferentie die gebruikmaakt van de SHARED ACCESS SIGNATURE identiteit. Als u een SAS (Shared Access Signature) wilt maken voor uw opslagaccount, raadpleegt u de eigenschap Shared Access Signature op de eigenschappenpagina van het opslagaccount in Azure Portal. Zie Beperkte toegang verlenen aan Azure Storage-resources met sas-(Shared Access Signatures) voor meer informatie over handtekeningen voor gedeelde toegang. Voor meer informatie over referenties, zie CREATE DATABASE SCOPED CREDENTIAL.

Maak een database-specifieke bevoegdheid met behulp van IDENTITY, die SHARED ACCESS SIGNATUREmoet zijn. Gebruik het SAS-token dat is gegenereerd voor het Blob Storage-account. Controleer of uw SAS-token geen voorloop-?heeft, of u ten minste leesmachtigingen hebt voor het object dat moet worden geladen en of de verloopperiode geldig is (alle datums zijn in UTC-tijd).

Bijvoorbeeld:

CREATE DATABASE SCOPED CREDENTIAL UploadInvoices
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
     SECRET = 'sv=2018-03-28&ss=b&srt=sco&sp=rwdlac&se=2019-08-31T02:25:19Z&st=2019-07-30T18:25:19Z&spr=https&sig=KS51p%2BVnfUtLjMZtUTW1siyuyd2nlx294tL0mnmFsOk%3D';

Bekende problemen

Aanvragen van Azure SQL Database en Azure SQL Managed Instance met behulp van SAS-tokens kunnen worden geblokkeerd met de volgende fout:

Msg 4861, Level 16, State 1, Line 27
Cannot bulk load because the file "FileName.extension" could not be opened. Operating system error code 5(Access is denied.).

Alleen een subset van Azure-services bevindt zich momenteel in de lijst met vertrouwde services. Zie Vertrouwde toegang voor resources die zijn geregistreerd in uw abonnementvoor een volledige lijst met vertrouwde services en updates in Azure Storage-firewallinstellingen.

Voorbeelden

Naast de voorbeelden in dit artikel kunt u ook de Azure SQL Database-gegevensvoorbeelden bekijken op GitHub.

Toegang tot gegevens in een CSV-bestand die verwijst naar een Azure Blob Storage-locatie

In het volgende voorbeeld wordt een externe gegevensbron gebruikt die verwijst naar een Azure-opslagaccount met de naam MyAzureInvoices.

CREATE EXTERNAL DATA SOURCE MyAzureInvoices
WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'https://newinvoices.blob.core.windows.net',
    CREDENTIAL = UploadInvoices
);

Vervolgens voegt de instructie OPENROWSET de containernaam (week3) toe aan de bestandsbeschrijving. Het bestand heeft de naam inv-2017-01-19.csv.

SELECT * FROM OPENROWSET(
   BULK 'week3/inv-2017-01-19.csv',
   DATA_SOURCE = 'MyAzureInvoices',
   FORMAT = 'CSV',
   FORMATFILE = 'invoices.fmt',
   FORMATFILE_DATA_SOURCE = 'MyAzureInvoices'
) AS DataFile;

Gebruik BULK INSERT, en gebruik de beschrijving van de container en het bestand:

BULK INSERT Colors2
FROM 'week3/inv-2017-01-19.csv'
WITH (DATA_SOURCE = 'MyAzureInvoices', FORMAT = 'CSV');

Toegang tot gegevens in een CSV-bestand dat verwijst naar een container in een Azure Blob Storage-locatie

In het volgende voorbeeld wordt een externe gegevensbron gebruikt die verwijst naar een container (met de naam week3) in een Azure-opslagaccount.

CREATE EXTERNAL DATA SOURCE MyAzureInvoicesContainer
WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'https://newinvoices.blob.core.windows.net/week3',
    CREDENTIAL = UploadInvoices
);

Vervolgens bevat de instructie OPENROWSET de containernaam niet in de bestandsbeschrijving:

SELECT * FROM OPENROWSET(
   BULK 'inv-2017-01-19.csv',
   DATA_SOURCE = 'MyAzureInvoicesContainer',
   FORMAT = 'CSV',
   FORMATFILE = 'invoices.fmt',
   FORMATFILE_DATA_SOURCE = 'MyAzureInvoices'
) AS DataFile;

Gebruik BULK INSERT, maar gebruik de containernaam niet in de bestandsbeschrijving:

BULK INSERT Colors2
FROM 'inv-2017-01-19.csv'
WITH (DATA_SOURCE = 'MyAzureInvoicesContainer', FORMAT = 'CSV');