在 Azure SQL DB 中处理错误“提供的数据源类型不支持外部表”?

Posted

技术标签:

【中文标题】在 Azure SQL DB 中处理错误“提供的数据源类型不支持外部表”?【英文标题】:Handle error "External tables are not supported with the provided data source type" in Azure SQL DB? 【发布时间】:2020-04-07 03:35:17 【问题描述】:

根据Microsoft Documentation,Azure SQL 数据库现在可以使用外部表,并将 Blob 存储作为数据源。

我能够根据下面的脚本创建TYPE = BLOB_STORAGE 的主密钥、凭据和数据源,并注意到此版本不支持文件格式(也不知道如何处理) .

所以我尝试创建一个外部表,其中一个字段为VARCHAR(MAX)。因此我遇到了这个错误消息:

Mensagem 46525、Nível 16、Estado 31、Linha 32 提供的数据源类型不支持外部表。

这是我一直在使用的脚本:

-- Cria uma chave mestra
CREATE MASTER KEY;
go

-- Cria credencial com a chave do Blob fsarquivo2 (essa é a chave)
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH
    IDENTITY = 'user',
    SECRET = 'Q/rAy00000000000000000000000003Zo4RsxbIb57i2DoJTtU4JYQl1W5FDBIITapphJDRSv4OtniL3Dg=='
;

-- Aqui vc mostra onde fica a fechadura através da URI
CREATE EXTERNAL DATA SOURCE AzureStorage
WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'wasbs://container0@fsblobstorage.blob.core.windows.net',
    CREDENTIAL = AzureStorageCredential
);


create external table luiz
(field varchar(MAX))
with
(
    DATA_SOURCE = AzureStorage,
    LOCATION = 'container0/terrcad.txt'
)

谁能帮帮我?

【问题讨论】:

【参考方案1】:

您所做的一切都是正确的,只是您尝试从 Blob 存储中的数据源创建外部表,但这是不可能的。您需要使用 BULK INSERT 或 OPENROWSET 来访问文件并将其导入,而不是创建外部表。

以下是使用 BULK/INSERT 的示例:

BULK INSERT Product
FROM 'container0/terrcad.txt'
WITH ( DATA_SOURCE = 'AzureStorage');

使用批量插入。

SELECT * FROM OPENROWSET(
   BULK 'inv-2017-01-19.csv',
   DATA_SOURCE = 'AzureStorage',
   FORMAT = 'CSV',
   FORMATFILE='invoices.fmt',
   FORMATFILE_DATA_SOURCE = 'MyAzureInvoices'
   ) AS DataFile;

更多信息,请访问this文章。

【讨论】:

什么是invoices.fmt?在我的 CSV 场景中,我在 blob 存储中只有 1 个文件,如果我为 FORMATFILE 弥补了一些东西,那么我会看到这个错误:Cannot bulk load. The file "foo.fmt" does not exist or you don't have file access rights. 它是一个格式文件。请阅读以下文档以了解如何创建格式文件:docs.microsoft.com/en-us/sql/relational-databases/import-export/…

以上是关于在 Azure SQL DB 中处理错误“提供的数据源类型不支持外部表”?的主要内容,如果未能解决你的问题,请参考以下文章

性能缓慢 Azure“Web 应用”+ Azure SQL DB

通过 ms jdbc 连接到 Azure SQL DB 的 Android 应用程序错误

如何使用 iOS Swift 在 Azure DB 中执行 SQL 字符串包含查询?

OLE DB 提供程序“ADSDSOObject”尚未注册 - 在 Azure SQL 托管实例中

使用 powershell 导出 azure db 时出错

关于从 access db 到 Azure SQL 的 ODBC 连接