我有一个存储过程,它通过网络路径访问服务器上的文件,但现在我们正在从服务器转移到 Azure Blob。是否可以通过存储过程访问 Azure Blob 上的文件?
存储过程主要读取服务器上的 CSV 文件并将这些文件中的数据插入到表中。
最佳答案
此功能已在 2017 年公共(public)预览版中记录,不久前我也遇到过类似的问题。
Azure SQL 数据库使您可以使用以下 SQL 语句直接加载存储在 Azure Blob 存储中的文件:
BULK INSERT T-SQL 命令将文件从 Blob 存储帐户加载到 SQL 数据库表中
OPENROWSET 表值函数,用于解析 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 属性中使用此外部数据源的名称。以下是指向公共(public) Azure Blob 存储帐户的外部数据源示例:
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH ( TYPE = BLOB_STORAGE, LOCATION =
'https://myazureblobstorage.blob.core.windows.net');
如果您的 Azure Blob 存储帐户不是公共(public)的,则需要使用 Azure 门户为该帐户生成共享访问签名 (SAS) key ,将 SAS key 放入 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);
引用文献
关于c# - 是否可以从存储过程访问 Azure Blob?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63332731/