Sql server 将CSV从Blob加载到Azure SQL Server-未找到引用的外部数据源

Sql server 将CSV从Blob加载到Azure SQL Server-未找到引用的外部数据源,sql-server,csv,azure,sqlbulkcopy,azure-sql-database,Sql Server,Csv,Azure,Sqlbulkcopy,Azure Sql Database,我正在尝试将blob存储中托管的CSV批量插入Azure SQL Server,如中所述 我的代码几乎完全取自 运行时,我收到以下错误: 找不到引用的外部数据源MyAzureBlobStorage 有什么想法吗?这是另一个示例。请注意,秘密是从azure门户复制的SAS令牌,没有前导“?” 大卫我也有同样的问题。我在@DavidBrowne Microsoft的评论中找到了答案,并将其粘贴到此处以使其更加可见: 我重新编程,大容量插入目前无法对临时表工作。创建一个永久表并重试 有人编辑了我的帖子

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

我的代码几乎完全取自

运行时,我收到以下错误:

找不到引用的外部数据源MyAzureBlobStorage


有什么想法吗?

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


大卫

我也有同样的问题。我在@DavidBrowne Microsoft的评论中找到了答案,并将其粘贴到此处以使其更加可见:


我重新编程,大容量插入目前无法对临时表工作。创建一个永久表并重试


有人编辑了我的帖子,拿走了我经过消毒的秘密,但我使用的SAS没有?。所以OPENROWSET查询可以工作,但是如果我尝试执行一个临时表的大容量插入,我仍然会得到相同的错误。您能看看在临时表中执行大容量插入是否对您的终端有效吗?我重新编程了,大容量插入目前对临时表不起作用。创建一个永久表并重试。如果出现以下错误:无法从链接服务器null的OLE DB提供程序批量中获取所需的接口IID_IColumnsInfo,请尝试指定ROWTERMINATOR='0x0a',我正在尝试使用一个永久表,并且可以肯定的是,对于链接服务器null错误,我无法从OLE DB提供程序批量中获取所需的接口IID_IColumnsInfo。我尝试了行终止符选项,但没有帮助。您是如何调试该错误以了解要尝试的选项的?显然,该错误可能意味着您的文件与预期格式之间存在任何类型的不匹配。我在这里浏览了示例:您应该尝试使用这些文件来隔离差异。@DavidBrowne Microsoft您知道为什么大容量插入不适用于临时表吗?目前:临时表实际上在Azure SQL上受支持,所以最新的SQL 2017 14.0.3008.27不支持它们
-- 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);
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;