大量存取 Azure Blob 儲存體中資料的範例

適用於: SQL Server 2017 (14.x) 和更新版本 Azure SQL 資料庫

BULK INSERTOPENROWSET 陳述式可以直接存取 Azure Blob 儲存體中的檔案。 下列範例會使用 CSV (逗號分隔值) 檔案 (名為 inv-2017-01-19.csv)、容器 (名為 Week3) 中所儲存或儲存體帳戶 (名為 newinvoices) 中所儲存的資料。

容器和 Blob 上檔案的所有路徑都是 區分大小寫。 如果不正確,可能會傳回如下列範例所示的錯誤:

無法大量載入。 沒有檔案 "file.csv",或您不具檔案存取權限。

建立認證

必須透過使用 SHARED ACCESS SIGNATURE 識別的資料庫範圍認證建立外部資料來源。 若要建立儲存體帳戶的共用存取簽章 (SAS),請參閱 Azure 入口網站之儲存體帳戶屬性頁面上的 [共用存取簽章] 屬性。 如需共用存取簽章的詳細資訊,請參閱使用共用存取簽章 (SAS) 授與 Azure 儲存體資源的有限存取權。 如需認證的詳細資訊,請參閱 CREATE DATABASE SCOPED CREDENTIAL

使用必須為 SHARED ACCESS SIGNATUREIDENTITY 建立資料庫範圍認證。 使用針對 Blob 儲存體帳戶所產生的 SAS 權杖。 請確認您的 SAS 權杖沒有前置 ?、您至少擁有應載入物件的讀取權限,以及到期期間是否有效 (所有日期都是 UTC 時間)。

例如:

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

已知問題

Azure SQL 資料庫和 Azure SQL 受控執行個體中使用 SAS 權杖的要求可能會遭到封鎖,並出現下列錯誤:

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

受信任服務清單上目前只有 Azure 服務的子集。 如需 Azure 儲存體防火牆設定上受信任服務和更新的完整清單,請參閱您訂用帳戶中已註冊資源的信任存取權

範例

除了本文中的範例之外,您也可以檢閱 GitHub 上的 Azure SQL 資料庫匯入資料範例

存取 CSV 檔案 (參考 Azure Blob 儲存體位置) 中的資料

下列範例會使用指向名為 MyAzureInvoices 之 Azure 儲存體帳戶的外部資料來源。

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

接著,OPENROWSET 陳述式將容器名稱 (week3) 新增至檔案描述。 檔案命名為 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;

使用 BULK INSERT 時,請使用容器和檔案描述︰

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

存取 CSV 檔案 (參考 Azure Blob 儲存體位置中的容器) 中的資料

下列範例會使用指向 Azure 儲存體帳戶中容器 (名為 week3) 的外部資料來源。

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

接著,OPENROWSET 陳述式不會將容器名稱包含在檔案描述中:

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

使用 BULK INSERT 時,請不要使用檔案描述中的容器名稱:

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