是否可以从存储过程访问azure blob?

7ajki6be  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(456)

我有一个通过网络路径访问服务器上文件的存储过程,但现在我们正在从服务器移动到azure blob。是否可以从存储过程访问azure blob上的文件?
存储过程基本上读取服务器上的csv文件,并将这些文件中的数据插入表中。

wkftcu5l

wkftcu5l1#

这项功能在2017年公共预览版中有记录,不久前我也遇到过类似的问题。
azure sql数据库允许您使用以下sql语句直接加载存储在azure blob存储中的文件:
大容量插入t-sql命令,用于将文件从blob存储帐户加载到sql数据库表中
openrowset表值函数,用于解析存储在blob存储中的文件,并将文件内容作为一组行返回
以下示例显示了将文件内容加载到sql数据库的大容量插入命令:

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存储帐户的外部数据源。您将在“数据源”属性中使用此外部数据源的名称。以下是指向公共azure blob存储帐户的外部数据源的示例:

CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH ( TYPE = BLOB_STORAGE, LOCATION = 
'https://myazureblobstorage.blob.core.windows.net');

如果您的azure blob存储帐户不是公共帐户,则需要使用azure门户为该帐户生成共享访问签名(sas)密钥,将sas密钥放入凭据中,并使用凭据创建外部数据源,如以下示例所示:

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

相关问题