Synapse/ADF管道将CSV Upsert至本地SQL Server表时出现2200错误求助
问题:ADF/Synapse Upsert CSV至SQL Server时遇text类型UNION操作报错(错误码5335)
问题背景
我在Synapse/ADF管道中执行将分号分隔的平面CSV文件Upsert至本地SQL Server表的操作:
- 初始状态:CSV所有字段读取为STRING类型,SQL表字段均设置为
NVARCHAR(500),基于EMPLOYEE_ID字段的Upsert可正常运行。 - 修改操作:因CSV来自另一MS SQL应用,将SQL表字段修改为源库对应的正确类型后,出现错误码2200的报错:
{ "errorCode": "2200", "message": "ErrorCode=SqlOperationFailed,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=A database operation failed. Please search error to get more details.,Source=Microsoft.DataTransfer.ClientLibrary,''Type=System.Data.SqlClient.SqlException,Message=The data type text cannot be used as an operand to the UNION, INTERSECT or EXCEPT operators because it is not comparable.,Source=.Net SqlClient Data Provider,SqlErrorNumber=5335,Class=16,ErrorCode=-2146232060,State=1,Errors=[{Class=16,Number=5335,State=1,Message=The data type text cannot be used as an operand to the UNION, INTERSECT or EXCEPT operators because it is not comparable.,},],'", "failureType": "UserError", "target": "EMP upsert", "details": [] }
报错提示text数据类型无法作为UNION、INTERSECT或EXCEPT运算符的操作数,但我并未使用text字段作为匹配依据,且已刷新Azure中所有架构定义,求问题原因及解决方法。
问题原因
ADF/Synapse的内置Upsert(Merge)操作底层会生成包含UNION的SQL语句,用于处理源数据与目标表的全字段对比或生成中间数据集——即使你未将TEXT类型字段用作匹配键,Merge逻辑在隐式处理过程中仍会涉及TEXT字段的集合操作。而SQL Server中TEXT属于不可比较的旧版大文本类型,不支持参与UNION、INTERSECT这类需要数据可对比的操作,因此触发错误5335。
解决方法
1. 替换TEXT类型为NVARCHAR(MAX)
TEXT类型已被SQL Server废弃,推荐使用NVARCHAR(MAX)替代,该类型支持所有字符串操作(包括UNION)。执行以下SQL修改字段:
ALTER TABLE [你的目标表名] ALTER COLUMN [TEXT类型字段名] NVARCHAR(MAX) NULL;
2. 同步ADF/Synapse数据集架构
- 刷新SQL目标表的数据集:在ADF/Synapse工作区找到对应SQL数据集,点击「刷新架构」,确保字段类型已更新为
NVARCHAR(MAX)。 - 检查字段映射:确认CSV数据集的STRING类型字段与SQL表的
NVARCHAR(MAX)字段映射无误,无类型不匹配问题。
3. 自定义Merge逻辑(替代内置Upsert)
若无法修改表字段类型,可改用存储过程活动实现Upsert,手动编写Merge逻辑,仅用EMPLOYEE_ID做匹配,避免TEXT字段参与集合操作:
CREATE PROCEDURE UpsertEmployeeData AS BEGIN SET NOCOUNT ON; MERGE INTO [目标表名] AS Target USING [CSV临时表名] AS Source ON Target.EMPLOYEE_ID = Source.EMPLOYEE_ID WHEN MATCHED THEN UPDATE SET Target.字段1 = Source.字段1, Target.字段2 = Source.字段2, Target.TEXT类型字段 = Source.TEXT类型字段 WHEN NOT MATCHED THEN INSERT (EMPLOYEE_ID, 字段1, 字段2, TEXT类型字段) VALUES (Source.EMPLOYEE_ID, Source.字段1, Source.字段2, Source.TEXT类型字段); END;
步骤说明:先通过ADF复制活动将CSV数据写入SQL临时表,再调用该存储过程完成Upsert。
内容的提问来源于stack exchange,提问作者AntonyJ
相关产品推荐
相关产品推荐

