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

適用于:SQL Server 2017 (14.x) 及更新版本 Azure SQL Database

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

使用 IDENTITY 建立資料庫範圍認證,必須是 SHARED ACCESS SIGNATURE 。 使用針對 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';

已知問題

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

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 資料庫匯入資料範例

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

下列範例會使用指向名為 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');

另請參閱