You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用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文件逐个处理:

  1. 每次处理单个文件前,先清空Staging表的历史残留数据
  2. 执行BULK INSERT把当前CSV文件的数据导入Staging表,示例语句:
BULK INSERT dbo.Staging_UserInfo
FROM '当前待处理的CSV文件名.csv'
WITH (
    DATA_SOURCE = 'BlobCsvSource',
    FORMAT = 'CSV',
    FIRSTROW = 1, -- 无表头,直接从第一行读数据
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n',
    TABLOCK
);
  1. 导入完成后用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 19:03:31