azure 将CSV插入内部SQL服务器表时出现Synapse/ADF管道错误2200

qmelpv7a  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(130)

在我的管道中,我从一个平面CSV文件(分号分隔)到我们内部SQL服务器的一个表中执行upsert。首先,CSV文件中的所有数据类型都被读取为STRING,我对SQL表也做了同样的操作,这意味着我将所有字段设置为NVARCHAR(500)。这工作得很好,upsert基于一个ID字段(EMPLOYEE_ID)。
这个CSV文件来自另一个应用程序(也是基于MS-SQL的)。所以我把所有的NVARCHAR(500)字段都改成了来自源数据库的正确字段。
现在我已经完成了,我得到这个错误:

{
    "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": []
}

我会看到它试图插入一个文本字段来执行UNION。但是我没有使用文本字段来匹配。有人能告诉我我做错了什么,以及如何解决它吗?
我已经刷新了Azure中的所有架构定义,以确保它正确地看到所有数据类型。

kx1ctssn

kx1ctssn1#

我尝试在我的环境中重现此问题,但最后还是出现相同的错误。

  • 错误的原因可能是upsert的逻辑,它将列作为键,并将值与源和目标进行比较,然后基于此更新或插入记录。
  • Text、xml、ntext这些数据类型不具有可比性
  • 此问题的解决方法是使用“使用nvarchar(max)varchar(max)varbinary(max)”转换数据类型为TEXT的列。

表格Microsoft Document
SQL Server得未来版本中将删除ntexttextimage数据类型.请避免在新得开发工作中使用这些数据类型,并计划修改当前使用它们得应用程序.请改用nvarchar(max)varchar(max)varbinary(max).
我在Pre-copy脚本中将Text数据类型的列转换为varchar(max),以便在upsert操作之前更改列数据类型。
查询:

ALTER TABLE dbo.yourtablename
ALTER COLUMN yourTextcolumnname VARCHAR(MAX)

管道执行成功:

相关问题