Azure Synapse Copy Data工具向ADLS Gen2写文件时遇转换溢出错误
SQL Server到ADLS Gen2数据抽取:转换溢出问题的解决方案
问题根源
溢出错误源于999999999.00000000000000000000这个高精度数值(大概率是SQL Server的decimal(28,20)类型),在抽取工具的默认类型映射中,目标端被分配了精度更低的类型,导致无法容纳该值。
保留源数据类型的解决方法
1. 调整抽取工具的类型映射
如果用Azure Data Factory(ADF)这类工具:
- 进入数据集的字段映射配置页,找到报错字段,手动将目标类型设置为与源SQL Server完全一致的高精度类型(如
decimal(28,20)),覆盖工具默认映射。 - 批量处理多张表时,可创建类型映射模板复用,或用数据流动的动态映射功能,自动继承源表的字段类型配置。
2. SQL端适配(不修改源数据类型)
放弃CAST转整数的方式,改用CONVERT将数值转为高精度字符串输出,既保留原始精度又避免溢出:
SELECT CONVERT(varchar(50), target_column) AS target_column FROM source_table
批量处理多张表可生成动态SQL:
DECLARE @batch_sql NVARCHAR(MAX) = N'' SELECT @batch_sql += N'SELECT ' + STRING_AGG(N'CONVERT(varchar(50), ' + QUOTENAME(COLUMN_NAME) + N') AS ' + QUOTENAME(COLUMN_NAME), N', ') + N' FROM ' + QUOTENAME(TABLE_SCHEMA) + N'.' + QUOTENAME(TABLE_NAME) + N';' FROM INFORMATION_SCHEMA.COLUMNS WHERE DATA_TYPE IN ('decimal', 'numeric') AND NUMERIC_PRECISION = 28 AND NUMERIC_SCALE = 20 EXEC sp_executesql @batch_sql
3. 文本文件格式配置优化
如果生成CSV等文本文件:
- 确保字段分隔符、引号包裹规则正确,防止数值被意外截断。
- 在抽取工具中开启保留原始精度的输出选项,比如ADF中直接匹配源字段的精度和小数位数参数。
多表批量处理要点
- 用工具的元数据驱动功能(如ADF的Lookup活动+ForEach循环),自动扫描所有待抽取表的字段类型,批量应用正确的映射规则。
- 提前批量校验所有涉及高精度数值的表,确保目标端类型配置与源端完全对齐。
内容的提问来源于stack exchange,提问作者BM Baloch
相关产品推荐
相关产品推荐

