如何不使用Azure Data Factory将Blob存储CSV加载到Azure SQL数据库
问题解答
完全可以不使用Azure Data Factory实现需求,全程基于Azure原生能力+T-SQL即可完成,不需要额外采购复杂服务。
基础信息对齐
- 运行环境:MS Azure
- 数据源:Azure Blob容器(指定目录下存储多份无表头CSV文件)
- 目标端:Azure SQL数据库
- 核心诉求:
- 批量加载Blob内所有CSV数据到Azure SQL,和目标库数据按主键匹配,匹配则更新、不匹配则插入
- 数据加载完成后,将已处理的CSV文件移动到Blob存储的归档目录
- 不使用ADF,优先采用Bulk Insert类的原生方法实现
无表头CSV数据样例:
1,Peter,35 2,John,28 3,Tony,24
落地实现步骤
1. 配置Azure SQL访问Blob的权限
先打通Azure SQL到Blob存储的访问链路,两种方式二选一即可:
- 给Azure SQL逻辑服务器开启系统分配托管标识,给该标识授予Blob存储对应容器的「存储Blob数据参与者」权限,覆盖待处理CSV目录、归档目录的读写权限,不需要额外配置密钥
- 手动生成Blob存储的SAS访问令牌,后续在Azure SQL中创建数据库作用域凭据存储令牌,通过凭据访问Blob
2. 创建数据库侧所需对象
首先根据CSV的字段结构创建对应表,假设CSV三列分别为ID(主键,作为数据匹配依据)、用户名、年龄:
- 目标业务表:
CREATE TABLE dbo.UserInfo ( ID INT PRIMARY KEY, UserName VARCHAR(50) NOT NULL, Age INT NOT NULL )
- 临时中转表(Staging表),结构和目标表完全一致,用来临时承接批量导入的原始数据,避免直接操作线上业务表:
CREATE TABLE dbo.Staging_UserInfo ( ID INT, UserName VARCHAR(50), Age INT )
- (使用SAS令牌访问的场景需要创建)数据库作用域凭据:
CREATE DATABASE SCOPED CREDENTIAL BlobStorageCredential WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '你生成的Blob存储SAS令牌';
- 创建指向Blob待处理CSV目录的外部数据源:
CREATE EXTERNAL DATA SOURCE BlobCsvSource WITH ( TYPE = BLOB_STORAGE, LOCATION = 'https://你的存储账户名.blob.core.windows.net/你的容器名/待处理CSV所在目录路径/', CREDENTIAL = BlobStorageCredential -- 用托管标识访问的场景不需要配置该行 );
3. 实现批量导入+UPSERT逻辑
Azure SQL原生支持BULK INSERT直接读取Blob内的CSV文件,因为CSV没有表头,导入时指定从第一行开始读取即可。多文件场景下可以通过存储过程循环遍历Blob目录下的CSV文件逐个处理:
- 每次处理单个文件前,先清空Staging表的历史残留数据
- 执行BULK INSERT把当前CSV文件的数据导入Staging表,示例语句:
BULK INSERT dbo.Staging_UserInfo FROM '当前待处理的CSV文件名.csv' WITH ( DATA_SOURCE = 'BlobCsvSource', FORMAT = 'CSV', FIRSTROW = 1, -- 无表头,直接从第一行读数据 FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', TABLOCK );
- 导入完成后用
MERGE语句实现匹配更新、不匹配插入的逻辑,把Staging表的数据同步到目标业务表:
MERGE dbo.UserInfo AS Target USING dbo.Staging_UserInfo AS Source ON Target.ID = Source.ID -- 按ID字段判断数据是否匹配 WHEN MATCHED THEN UPDATE SET Target.UserName = Source.UserName, Target.Age = Source.Age WHEN NOT MATCHED BY TARGET THEN INSERT (ID, UserName, Age) VALUES (Source.ID, Source.UserName, Source.Age);
4. 实现已处理文件归档
纯T-SQL直接操作Blob移动文件的配置成本较高,推荐用轻量计算资源实现,成本极低:
- 方案:创建时间触发的Azure Function(支持Python/PowerShell/C#等任意你熟悉的语言,消费计划下基本无额外成本),每次数据库完成数据导入后,把已处理的CSV文件从待处理目录移动到归档目录,同时删除待处理目录下的源文件即可。
5. 调度配置
不需要ADF的情况下,直接用Azure Automation Runbook或者Azure Function自带的时间触发器,按你需要的周期(比如每日凌晨)触发整个「扫描文件-批量导入-UPSERT同步-文件归档」流程即可,整体维护成本和资源成本都远低于ADF。
内容的提问来源于stack exchange,提问作者Suganesh Baskar
相关产品推荐
相关产品推荐

