Condividi tramite


Esempi di accesso bulk ai dati nell'Archiviazione BLOB di Azure

Si applica a: SQL Server 2017 (14.x) e alle sue versioni successive Database SQL di Azure Istanza gestita di SQL di Azure

Le istruzioni BULK INSERT e OPENROWSET consentono di accedere direttamente a un file nell'Archiviazione BLOB di Azure. Gli esempi seguenti usano dati da un file CSV (con valori delimitati da virgola) denominato inv-2017-01-19.csv, archiviato in un contenitore denominato Week3 e archiviato in un account di archiviazione denominato newinvoices.

Tutti i percorsi del contenitore e dei file nel archiviazione BLOB presentano la distinzione tra maiuscole e minuscole. Se l'impostazione non è corretta, potrebbe restituire un errore come quello dell'esempio seguente:

Impossibile eseguire il caricamento bulk. Il file "file.csv" non esiste oppure non si dispone dell'autorizzazione per accedervi.

Creare le credenziali

L'origine dati esterna deve essere creata con credenziali con ambito database che usano l'identità SHARED ACCESS SIGNATURE. Per creare una firma di accesso condiviso (SAS) per l'account di archiviazione, vedere la proprietà Firma di accesso condiviso nella pagine delle proprietà dell'account di archiviazione, nel portale di Azure. Per altre informazioni sulle firme di accesso condiviso, vedere Concedere accesso limitato alle risorse di archiviazione di Azure tramite firme di accesso condiviso (SAS). Per altre informazioni sulle credenziali, vedere CREATE DATABASE SCOPED CREDENTIAL.

Creare credenziali con ambito database usando IDENTITY, che deve essere SHARED ACCESS SIGNATURE. Usare il token di firma di accesso condiviso generato per l'account di archiviazione BLOB. Verificare che il token di firma di accesso condiviso non abbia un ? iniziale, che sia disponibile almeno l'autorizzazione di lettura per l'oggetto che deve essere caricato e che il periodo di scadenza sia valido (tutte le date sono in ora UTC).

Ad esempio:

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';

Problemi noti

Le richieste dal database SQL di Azure e dall'Istanza gestita di SQL di Azure che usano token di firma di accesso condiviso potrebbero essere bloccate con l'errore seguente:

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.).

Attualmente, solo un sottoinsieme di servizi di Azure è presente nell'elenco servizi attendibili. Per un elenco completo dei servizi attendibili e degli aggiornamenti sulle impostazioni del firewall di archiviazione di Azure, vedere Accesso attendibile per le risorse registrate nella sottoscrizione.

Esempi

Oltre agli esempi in questo articolo, è inoltre possibile esaminare gli esempi di dati di importazione database SQL di Azure in GitHub.

Accedere ai dati in un file CSV che fa riferimento a un percorso di archiviazione BLOB di Azure

L'esempio seguente usa un'origine dati esterna che punta a un account di archiviazione di Azure denominato MyAzureInvoices.

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

L'istruzione OPENROWSET aggiunge quindi il nome del contenitore (week3) alla descrizione del file. Il file è denominato 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;

Con BULK INSERT, usare il contenitore e la descrizione del file:

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

Accedere ai dati in un file CSV che fa riferimento a un contenitore in un percorso di archiviazione BLOB di Azure

L'esempio seguente usa un'origine dati esterna che punta a un contenitore denominato week3 in un account di archiviazione di Azure.

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

L'istruzione OPENROWSET non include il nome contenitore nella descrizione del file:

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

Con BULK INSERT, non usare il nome contenitore nella descrizione del file:

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