Contoh akses massal ke data di Azure Blob Storage

Berlaku untuk: SQL Server 2017 (14.x) dan azure SQL DatabaseAzure SQL Managed Instance yang lebih baru

Pernyataan BULK INSERT dan OPENROWSET dapat langsung mengakses file di Azure Blob Storage. Contoh berikut menggunakan data dari file CSV (nilai yang dipisahkan koma) (bernama inv-2017-01-19.csv), disimpan dalam kontainer (bernama Week3), disimpan dalam akun penyimpanan (bernama newinvoices).

Semua jalur ke kontainer dan ke file di Blob Storage peka huruf besar/kecil. Jika tidak benar, kesalahan mungkin mengembalikan kesalahan seperti contoh berikut:

Tidak dapat memuat secara massal. File "file.csv" tidak ada atau Anda tidak memiliki hak akses file.

Membuat kredensial

Sumber data eksternal harus dibuat dengan kredensial cakupan database yang menggunakan SHARED ACCESS SIGNATURE identitas. Untuk membuat tanda tangan akses bersama (SAS) untuk akun penyimpanan Anda, lihat properti Tanda tangan akses bersama di halaman properti akun penyimpanan di portal Azure. Untuk informasi selengkapnya tentang tanda tangan akses bersama, lihat Berikan akses terbatas ke sumber daya Azure Storage dengan menggunakan tanda tangan akses bersama (SAS). Untuk informasi selengkapnya tentang kredensial, lihat MEMBUAT KREDENSIAL CAKUPAN DATABASE.

Buat kredensial lingkup database menggunakan IDENTITY, yang harus SHARED ACCESS SIGNATURE. Gunakan token SAS yang dihasilkan untuk akun Blob Storage. Verifikasi bahwa token SAS Anda tidak memiliki di depan ?, bahwa Anda memiliki setidaknya izin baca pada objek yang harus dimuat, dan bahwa periode kedaluwarsa valid (semua tanggal berada dalam waktu UTC).

Contohnya:

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

Masalah umum

Permintaan dari Azure SQL Database dan Azure SQL Managed Instance menggunakan token SAS mungkin diblokir dengan kesalahan berikut:

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

Hanya subset layanan Azure yang saat ini ada di daftar layanan tepercaya. Untuk daftar lengkap layanan tepercaya dan pembaruan pada pengaturan firewall penyimpanan Azure, lihat Akses tepercaya untuk sumber daya yang terdaftar di langganan Anda.

Contoh

Bersama dengan contoh dalam artikel ini, Anda juga dapat meninjau sampel data impor Azure SQL Database di GitHub.

Mengakses data dalam file CSV yang mereferensikan lokasi Azure Blob Storage

Contoh berikut menggunakan sumber data eksternal yang menunjuk ke akun penyimpanan Azure, bernama MyAzureInvoices.

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

OPENROWSET Kemudian pernyataan menambahkan nama kontainer (week3) ke deskripsi file. File diberi nama 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;

Menggunakan BULK INSERT, gunakan kontainer dan deskripsi file:

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

Mengakses data dalam file CSV yang mereferensikan kontainer di lokasi Azure Blob Storage

Contoh berikut menggunakan sumber data eksternal yang menunjuk ke kontainer (bernama week3) di akun penyimpanan Azure.

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

OPENROWSET Kemudian pernyataan tidak menyertakan nama kontainer dalam deskripsi file:

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

Menggunakan BULK INSERT, jangan gunakan nama kontainer dalam deskripsi file:

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