如何解决ADF同步Synapse源表到目标表时触发最大拒绝阈值错误
SQLServerException: Query aborted-- the maximum reject threshold (0 rows) was reached while reading from an external source: 1 rows rejected out of total 1 rows processed. Column ordinal: 26, Expected data type: VARCHAR(255) collate SQL_Latin1_General_CP1_CI_AS NOT
问题核心原因
该报错触发是因为ADF copy活动设置了0行容错阈值,读取源表第26列时,数据不符合目标表的字段定义要求,具体可能的原因如下:
- 源表第26列的字符串长度超过目标表定义的VARCHAR(255)上限
- 源表第26列存在NULL值,目标表该字段设置了NOT NULL约束
- 源表第26列的排序规则与目标要求的
SQL_Latin1_General_CP1_CI_AS不匹配,字符转换失败 - 源表第26列存在回车、换行等特殊不可见字符,ADF读取时无法识别为合法VARCHAR类型
具体解决方案
步骤1:定位问题数据
运行以下SQL查询源表确认问题类型,注意替换查询中的「源表名」「第26列实际名称」:
-- 检查是否存在长度超过255的记录 SELECT [第26列实际名称], LEN([第26列实际名称]) AS 字符长度 FROM [源表名] WHERE LEN([第26列实际名称]) > 255; -- 检查是否存在NULL值 SELECT * FROM [源表名] WHERE [第26列实际名称] IS NULL; -- 检查源表第26列的排序规则是否匹配 SELECT name, collation_name FROM sys.columns WHERE object_id = OBJECT_ID('[源表名]') AND column_id = 26;
步骤2:对应问题处理
- 字段长度超限处理:
- 方案1:修改目标表字段定义,放大VARCHAR长度,执行SQL:
ALTER TABLE [目标表名] ALTER COLUMN [第26列名] VARCHAR(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL; - 方案2:在ADF源查询中截断超长字段,写法:
SELECT 其他字段, LEFT([第26列名],255) AS [第26列名] FROM [源表名]
- 方案1:修改目标表字段定义,放大VARCHAR长度,执行SQL:
- 存在NULL值处理:
- 方案1:移除目标表该字段的NOT NULL约束,执行SQL:
ALTER TABLE [目标表名] ALTER COLUMN [第26列名] VARCHAR(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL; - 方案2:在ADF源查询中填充默认值,写法:
SELECT 其他字段, ISNULL([第26列名], '填充的默认值') AS [第26列名] FROM [源表名]
- 方案1:移除目标表该字段的NOT NULL约束,执行SQL:
- 排序规则不匹配处理:
在ADF源查询中强制转换排序规则,写法:SELECT 其他字段, [第26列名] COLLATE SQL_Latin1_General_CP1_CI_AS AS [第26列名] FROM [源表名] - 存在特殊不可见字符处理:
在ADF源查询中清洗特殊字符,写法:SELECT 其他字段, TRIM(REPLACE(REPLACE([第26列名], CHAR(10), ''), CHAR(13), '')) AS [第26列名] FROM [源表名]
步骤3:临时容错验证(可选)
如果需要快速测试流程,可临时调整ADF copy活动的容错阈值:
- 打开ADF copy活动的「设置」页
- 找到「容错」配置项,将「拒绝的最大行数」修改为大于0的数值,比如10
- 运行任务后查看生成的拒绝日志,可直接获取错误行的具体内容
测试完成后请根据业务要求调整回合适的容错阈值,避免脏数据入库
内容的提问来源于stack exchange,提问作者Ashok Kumar Bollineni
相关产品推荐
相关产品推荐

