此功能已在 2017 年公开预览版中记录,前段时间我遇到过类似问题。
Azure SQL 数据库使您能够使用以下 SQL 语句直接加载存储在 Azure Blob 存储中的文件:
以下示例显示了将文件内容加载到 SQL 数据库中的 BULK INSERT 命令:
BULK INSERT Product
FROM 'data/product.dat'
WITH ( DATA_SOURCE = 'MyAzureBlobStorageAccount');
您可以使用 OPENROWSET 函数解析远程文件的内容并返回
文件中的行作为结果:
SELECT Name, Color, Price, Size, Quantity, Data, Tags
FROM OPENROWSET(BULK 'data/product.bcp', DATA_SOURCE = 'MyAzureBlobStorage',
FORMATFILE='data/product.fmt', FORMATFILE_DATA_SOURCE = 'MyAzureBlobStorage') as products;
作为先决条件,您需要创建一个指向您的 Azure Blob 存储帐户的外部数据源。您将在 DATA_SOURCE 属性中使用此外部数据源的名称。下面是一个指向公共 Azure Blob 存储帐户的外部数据源示例:
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH ( TYPE = BLOB_STORAGE, LOCATION =
'https://myazureblobstorage.blob.core.windows.net');
如果您的 Azure Blob 存储帐户不是公共的,则需要使用 Azure 门户为该帐户生成共享访问签名 (SAS) 密钥,将 SAS 密钥放入 CREDENTIAL 中,并使用 CREDENTIAL 创建一个外部数据源,如下例所示:
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'sv=2015-12-11&ss=b&srt=sco&sp=rwac&se=2017-02-01T00:55:34Z&st=2016-12-29T16:55:34Z&spr=https&sig=copyFromAzurePortal';
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH ( TYPE = BLOB_STORAGE,
LOCATION = 'https://myazureblobstorage.blob.core.windows.net',
CREDENTIAL= MyAzureBlobStorageCredential);
参考文献
https://azure.microsoft.com/en-us/updates/preview-loading-files-from-azure-blob-storage-into-sql-database/
https://github.com/Microsoft/sql-server-samples/tree/master/samples/features/sql-bulk-load/load-from-azure-blob-storage
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql?view=sql-server-ver15