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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:01:09