Azure Data Factory:为每行生成20位纯数字唯一ID并写入SQL表
实现20位纯数字唯一ID生成方案(Azure Data Factory场景)
针对你的需求,这里提供几个在ADF中可行的纯数字20位唯一ID生成方案,适配Lookup活动输出的N行数据:
方案一:高精度时间戳直接生成(最简单,无冲突风险)
利用微秒级时间戳的唯一性,直接生成刚好20位的数字ID:
在Data Flow的派生列活动中,使用以下表达式:
toString(currentTimestamp(), 'yyyyMMddHHmmssffffff')
- 格式说明:
yyyyMMddHHmmssffffff对应4位年+2位月+2位日+2位时+2位分+2位秒+6位微秒,总长度恰好20位 - 唯一性保障:微秒级精度确保同一微秒内最多生成1条ID,完全满足常规数据处理场景的唯一性要求
方案二:时间戳+自增序号(适配高并发批量场景)
如果你的数据量极大(同一微秒内处理超过100万行),可以拆分时间戳+自增序号的组合:
在Data Flow中添加派生列,表达式如下:
concat(toString(currentTimestamp(), 'yyyyMMddHHmmssSSS'), lpad(toString(rowNumber()), 7, '0'))
- 拆分说明:17位毫秒时间戳(
yyyyMMddHHmmssSSS) + 7位补零自增序号,总长度20位 - 唯一性保障:同一毫秒内支持最多1000万行的唯一ID生成,覆盖绝大多数高并发场景
方案三:在Lookup存储过程中预生成ID(减少ADF逻辑)
如果允许修改FetchIDs存储过程,可以直接在查询时生成20位ID,避免在ADF中额外处理:
修改存储过程的查询语句,添加自定义ID字段:
SELECT name, ID, City, State, -- 生成20位纯数字唯一ID:日期(8位)+时间(6位)+行号(6位) CONCAT( CONVERT(VARCHAR(8), GETDATE(), 112), -- yyyyMMdd REPLACE(CONVERT(VARCHAR(8), GETDATE(), 108), ':', ''), -- HHmmss RIGHT('000000' + CAST(ROW_NUMBER() OVER (ORDER BY ID) AS VARCHAR(6)), 6) -- 补零行号 ) AS CustomID FROM YourSourceTable
之后Lookup活动的输出会直接包含CustomID字段,可直接映射到OutputTable的对应列。
方案四:基于现有ID扩展(适合关联原有数据)
如果需要和原有ID关联,可结合时间戳+补位原有ID生成20位唯一ID:
在Data Flow派生列中使用:
concat(toString(currentTimestamp(), 'yyyyMMddHHmm'), lpad(toString(ID), 8, '0'))
- 组合说明:12位时间戳(
yyyyMMddHHmm) + 8位补零原有ID,总长度20位 - 注意:如果原有ID可能重复,需额外添加自增序号来保障唯一性,比如:
concat(toString(currentTimestamp(), 'yyyyMMddHH'), lpad(toString(ID), 6, '0'), lpad(toString(rowNumber()), 4, '0'))
后续操作
无论采用哪种方案,最终都可以通过ADF的Copy活动或Data Flow的Sink组件,将包含新生成ID的数据写入OutputTable,完成字段映射即可。
内容的提问来源于stack exchange,提问作者rsram312
相关产品推荐
相关产品推荐

