Esempi di accesso bulk ai dati in Archiviazione BLOB di Azure
Si applica a: SQL Server 2017 (14.x) e versioni successive
Azure SQL Database
Le BULK INSERT
istruzioni e OPENROWSET
possono accedere direttamente a un file in 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
.
Importante
Tutti i percorsi del contenitore e dei file nell'archiviazione BLOB fanno distinzione tra maiuscole e minuscole. Se non è corretto, potrebbe essere restituito un errore simile a "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 per l'account di archiviazione, vedere la proprietà Firma di accesso condiviso nella pagina delle proprietà dell'account di archiviazione nel portale di Azure. Per altre informazioni sulle firme di accesso condiviso, vedere Concedere l'accesso limitato alle risorse di Archiviazione di Azure usando firme di accesso condiviso. Per altre informazioni sulle credenziali, vedere CREATE DATABASE SCOPED CREDENTIAL.
Creare una credenziale 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 disponga di un'autorizzazione di lettura iniziale ?
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 da Azure SQL database e Istanza gestita di SQL di Azure che usano token di firma di accesso condiviso possono 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.).
Solo un subset di servizi di Azure è attualmente presente nell'elenco dei servizi attendibili. Per un elenco completo dei servizi attendibili e degli aggiornamenti nelle impostazioni del firewall di archiviazione di Azure, vedere Accesso attendibile per le risorse registrate nella sottoscrizione.
Esempio
Oltre agli esempi in questo articolo, è anche possibile esaminare gli esempi di dati di importazione del database di Azure SQL 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 quindi il nome del 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;
Usando BULK INSERT
, non usare il nome del contenitore nella descrizione del file:
BULK INSERT Colors2
FROM 'inv-2017-01-19.csv'
WITH (DATA_SOURCE = 'MyAzureInvoicesContainer',
FORMAT = 'CSV');