巨大的编辑 - 我删除了&#39 ;;'字符并替换为' GO'和...辅助密钥和URL工作,除了我得到这个: 无法批量加载。文件" 06May2013_usr_tmp_cinmachI.csv"不存在或您没有文件访问权限。
顺便说一句,这可能是真的:) - 我可以使用PowerShell上传文件,因此我确定它不是我的帐户凭据。以下是我现在使用的代码,再次,无论我对此编辑器做什么,它都适合{}块,抱歉给您带来不便。文档可以使用CREATE MASTER KEY以后加密SECRET但是没有明显的链接,假设这一切都在幕后 - 是吗?如果没有,那可能是导致访问错误的原因。
因此,数据源不存在的问题是错误的语法 - 无法使用&#39 ;;'显然是为了终止SQL块但是“GO'会工作的。
CSV文件确实存在:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'S0me!nfo'
GO
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'removed'
GO
CREATE EXTERNAL DATA SOURCE myDataSource
WITH (TYPE = BLOB_STORAGE, LOCATION = 'https://dtstestcsv.blob.core.windows.net/sunsource', CREDENTIAL = AzureStorageCredential)
GO
BULK
INSERT dbo.ISSIVISFlatFile
FROM '06May2013_usr_tmp_cinmachI.csv'
WITH
(DATA_SOURCE = 'myDataSource', FORMAT = 'CSV')
答案 0 :(得分:0)
我觉得有必要发布一些信息,即使这不是一个完整的答案。
我收到了这个错误:
Msg 4860,Level 16,State 1,Line 58 无法批量加载。文件“container / folder / file.txt”不存在,或者您没有文件访问权限。
我认为问题可能是我现在从生成了我的SAS密钥,但这是UTC时间,这意味着在澳大利亚,密钥只在十小时内生效。所以我生成了一个新的密钥,它在一个月前开始运行。
SAS(共享访问签名)是一个大字符串,其创建如下:
?
,然后将其粘贴到您的SQL脚本中下面是我的完整脚本和评论。
-- Target staging table
IF object_id('recycle.SampleFile') IS NULL
CREATE TABLE recycle.SampleFile
(
Col1 VARCHAR(MAX)
);
-- more info here
-- https://blogs.msdn.microsoft.com/sqlserverstorageengine/2017/02/23/loading-files-from-azure-blob-storage-into-azure-sql-database/
-- You can use this to conditionally create the master key
select * from sys.symmetric_keys where name like '%DatabaseMasterKey%'
-- Run once to create a database master key
-- Can't create credentials until a master key has been generated
-- Here, zzz is a password that you make up and store for later use
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'zzz';
-- Create a database credential object that can be reused for external access to Azure Blob
CREATE DATABASE SCOPED CREDENTIAL BlobTestAccount
WITH
-- Must be SHARED ACCESS SIGNATURE to access blob storage
IDENTITY= 'SHARED ACCESS SIGNATURE',
-- Generated from Shared Access Signature area in Storage account
-- Make sure the start date is at least a few days before
-- otherwise UTC can mess you up because it might not be valid yet
-- Don't include the ? or the endpoint. It starts with 'sv=', NOT '?' or 'https'
SECRET = 'sv=2016-05-31&zzzzzzzzzzzz'
-- Create the external data source
-- Note location starts with https. I've seen examples without this but that doesn't work
CREATE EXTERNAL DATA SOURCE BlobTest
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://yourstorageaccount.blob.core.windows.net',
CREDENTIAL= BlobTestAccount);
BULK INSERT recycle.SampleFile
FROM 'container/folder/file'
WITH ( DATA_SOURCE = 'BlobTest');
-- If you're fancy you can use these to work out if your things exist first
select * from sys.database_scoped_credentials
select * from sys.external_data_sources
DROP EXTERNAL DATA SOURCE BlobTest;
DROP DATABASE SCOPED CREDENTIAL BlobTestAccount;
这个不会做ADF所做的一件事就是拿起一个基于通配符的文件。
那就是:如果我有一个名为ABC_20170501_003.TXT
的文件,我需要在bulk insert
加载脚本中明确列出该文件,而在ADF中我只需指定ABC_20170501
并自动指定通配符其余的
不幸的是,没有(简单)方法从SQL Server枚举blob存储中的文件。我最终通过使用Azure自动化运行PowerShell脚本来枚举文件并将它们注册到SQL Server可以看到的表中来解决这个问题。这似乎很复杂,但实际上Azure自动化是一个非常有用的学习和使用工具,并且它非常可靠地工作
关于ADF的更多意见:
我找不到将我加载的文件名(或其他信息)传递到数据库的方法。
如果您需要按照文件中出现的顺序加载数据(即由标识字段捕获),请不要使用ADF。 ADF将尝试并行处理事情。事实上,我的ADF确实插入了大约一个星期的东西(即由身份记录)然后有一天它刚刚开始插入无序的东西。
时间片概念在有限的情况下非常有用(当您在干净地描绘的文件中清晰地描述了您想要整齐地放入表格中的数据时)。在任何其他情况下,它都是复杂,笨拙且难以理解和使用的。根据我的经验,现实世界数据需要更复杂的规则才能计算出来并应用正确的合并密钥。
我不知道通过ADF导入文件和通过BULK INSERT导入文件之间的成本差异,但ADF很慢。我现在没有耐心通过Azure刀片来查找指标,但是您在ADF中谈论5分钟与批量插入中的5秒钟
尝试Azure Data Factory V2。 大大改进了,你不再受时间限制了。