将Azure Blob存储中的文件读入Azure SQL数据库

时间:2017-10-31 21:22:02

标签: sql-server azure-sql-database azure-storage

我已经使用本地SQL Server Express设置测试了这个设计。

我将几个.json文件上传到Azure存储 在SQL数据库中,我创建了一个外部数据源:

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

然后我尝试使用我的外部数据源查询文件:

select *
from OPENROWSET
 (BULK 'my_test_doc.json', DATA_SOURCE = 'MyAzureStorage', SINGLE_CLOB) as data

然而,这失败并显示错误消息"无法批量加载。文件" prod_EnvBlow.json"不存在或您没有文件访问权限。"

我是否需要配置DATABASE SCOPED CREDENTIAL来访问文件存储,如此处所述? https://docs.microsoft.com/en-us/sql/t-sql/statements/create-database-scoped-credential-transact-sql

还有什么人可以看到出错了我需要纠正吗?

2 个答案:

答案 0 :(得分:2)

Azure SQL数据库目前不支持

OPENROWSET,如本documentation page中所述。您可以使用BULK INSERT将数据插入临时表,然后查询此表。有关BULK INSERT的文档,请参阅this page

答案 1 :(得分:0)

现在OPENROWSET处于公开预览状态,以下工作正常。 Nb关键选项是万一你的blob不公开。我在带有作用域凭据选项的私有blob上尝试了它并且它有效。 nnb如果您使用SAS密钥,请务必删除前导?,以便字符串应以sv开头,如下所示。

确保blobcontainer/my_test_doc.json部分指定正确的路径,例如container/file

CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'sv=2017****************';

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

DECLARE @json varchar(max)
SELECT @json = BulkColumn FROM OPENROWSET(BULK 'blobcontainer/my_test_doc.json', 
SINGLE_BLOB, DATA_SOURCE = 'MyAzureBlobStorage',
            FORMATFILE_DATA_SOURCE = 'MyAzureBlobStorage') as j;

select @json;

这些docs

中提供了更多详细信息