【问题标题】:Load CSV from Blob to Azure SQL Server - Referenced external data source not found将 CSV 从 Blob 加载到 Azure SQL Server - 找不到引用的外部数据源
【发布时间】:2017-10-04 10:33:42
【问题描述】:

我正在尝试将托管在 blob 存储中的 CSV 批量插入 Azure SQL Server,如this MSDN post 中所述。

我的代码几乎完全来自this Microsoft Github sample

运行时出现以下错误:

未找到引用的外部数据源“MyAzureBlobStorage”。

-- Create Database Master Key
IF (select Count(*) from sys.symmetric_keys where name like '%DatabaseMasterKey%') = 0
BEGIN
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MYPASSWORD'; 
END

-- Create Storage Credential
IF (select Count(*) from sys.database_credentials where name = 'MyAzureBlobStorageCredential') = 0
BEGIN
print 'Creating credential'
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = '<secret>';
END

-- Create External Data Source
IF (select Count(*) from sys.external_data_sources where name = 'MyAzureBlobStorage') = 0
BEGIN
print 'creating external data source'
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH ( TYPE = BLOB_STORAGE,
    LOCATION = 'https://myaccount.blob.core.windows.net/upload',
    CREDENTIAL= MyAzureBlobStorageCredential);
END

-- Create temp table to hold data
IF OBJECT_ID('tempdb..#mytemptable') IS NOT NULL DROP TABLE #mytemptable
CREATE TABLE #mytemptable(
    [Id] [uniqueidentifier] NOT NULL
    -- etc
)

-- Bulk insert into temp table
BULK INSERT #mytemptable
FROM 'mycsv.csv'
WITH ( DATA_SOURCE = 'MyAzureBlobStorage',
        FORMAT='CSV', CODEPAGE = 65001, --UTF-8 encoding
        FIRSTROW=2,
        TABLOCK);

有什么想法吗?

【问题讨论】:

    标签: sql-server csv azure sqlbulkcopy azure-sql-database


    【解决方案1】:

    我有同样的问题。我在@DavidBrowne-Microsoft 的 cmets 中找到了答案,将其粘贴到此处以使其更明显:

    我重新制作了,并且 BULK INSERT 目前不适用于临时表。创建一个永久表并尝试。

    【讨论】:

    • 目前:Azure SQL 实际上支持临时表,所以奇怪的是它们在最新的 SQL 2017 (14.0.3008.27) 上不受支持
    【解决方案2】:

    这是另一个示例。请注意,秘密是从 azure 门户复制的“SAS 令牌”,没有前导“?”

    drop DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
    drop  EXTERNAL DATA SOURCE MyAzureBlobStorage
    
    go
    -- Create Storage Credential
    print 'Creating credential'
    CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
    SECRET = 'sv=2016-05-31&ss=bfqt&srt=sco&sp=rwdlacup&se=2017-05-08T23:03:46Z&st=2017-05-08T15:03:46Z&spr=https&sig=nxxxUJXfp%2BL23%2FULs2wY3%2BYAdFewzNsqp73rcsSoge4%3D';
    
    -- Create External Data Source
    --full url https://myaccount.blob.core.windows.net/files/tran.csv
    print 'creating external data source'
    CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
    WITH ( TYPE = BLOB_STORAGE,
        LOCATION = 'https://myaccount.blob.core.windows.net/files',
        CREDENTIAL= MyAzureBlobStorageCredential);
    
    --test
    SELECT * FROM OPENROWSET(
       BULK  'tran.csv',
       DATA_SOURCE = 'MyAzureBlobStorage',
       SINGLE_CLOB) AS DataFile;
    

    大卫

    【讨论】:

    • 有人编辑了我的帖子并取出了我的(清理过的)秘密,但我使用的是没有 ? 的 SAS。所以OPENROWSET 查询有效,但如果我尝试在临时表中执行BULK INSERT,我仍然会遇到同样的错误。你能看看在临时表中执行BULK INSERT 是否对你有用吗?
    • 我重新制作了,并且 BULK INSERT 目前不适用于临时表。创建一个永久表并尝试。如果您收到此错误:“无法从链接服务器“(null)”的 OLE DB 提供程序“BULK”获取所需的接口(“IID_IColumnsInfo”)”尝试指定 ROWTERMINATOR = '0x0a',
    • 我正在尝试使用永久表,果然我收到了 Cannot obtain the required interface ("IID_IColumnsInfo") from OLE DB provider "BULK" for linked server "(null)" 错误。我尝试了行终止符选项,但没有帮助。您是如何调试该错误以知道要尝试哪个选项的?
    • 显然该错误可能意味着您的文件与预期格式之间存在任何类型的不匹配。我在这里浏览了示例:github.com/Microsoft/sql-server-samples/tree/master/samples/…您应该尝试使用这些文件来隔离差异。
    • @DavidBrowne-Microsoft 你知道为什么 BULK INSERT 对临时表不起作用吗?
    猜你喜欢
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 2021-07-21
    • 2021-06-26
    • 2021-07-02
    • 1970-01-01
    • 2017-08-05
    • 2019-05-16
    相关资源
    最近更新 更多