我在Azure数据工厂中有一个管道来接收传入的CSV文件并将其保存到SQL服务器数据库,我使用一个复制活动来获取争论不休的CSV文件并调用一个存储过程将其保存到数据库表中。
但是,CSV文件中的某些记录在某些列中缺少值的情况并不罕见。这种缺少值的情况将导致复制活动失败,下面是错误消息:
错误代码=无效参数,类型=Microsoft.数据传输.公共.共享.混合传递异常,消息=属性“”的值无效:无法将列'col 1'设置为Null请改用DBNull
如果传入数据中没有缺失值,则复制活动将正确运行。
下面是遇到缺少值时执行失败的存储过程的代码段。
INSERT INTO target_table(
[Id],
[col 1],
[col 2],
[col 3]
)
SELECT
[source Id],
[column 1],
[column 2],
[column 3]
FROM source_table
我的问题是如何将CSV文件中缺少的值转换为SQL Server能够理解的空值。
我原本以为问题出在数据库端,所以我在SQL Server中创建了一个测试表,并将一些有意缺失值的测试数据放入测试表中,然后运行存储过程。这些缺失值的记录被正确地保存到目标表中。所以我意识到问题出在复制活动接收CSV文件并将其传递给存储过程时。并且缺少的值没有很好地转换为SQLServer可以理解的空值。
3条答案
按热度按时间rsaldnfx1#
您可以使用数据流活动将值设置为NULL。
*采用派生列转换,表达式为
iifNull(id,toString(null()))
*结果
zzlelutf2#
您是否在复制活动中尝试过此选项?
这个应该可以
ulydmbyx3#
经过多次尝试,下面是我对这个问题的解决方案。2虽然不是很理想,但是很有效。3解决方案是我在SQL Server中创建了一个永久临时表,然后使用复制活动将CSV数据传输到这个临时表中。4诀窍是在复制活动中使用插入选项(见图)而不是使用存储过程,这是我以前试图做的。
感觉在复制活动和SQL服务器之间有某种内部机制来处理缺失的值。一旦将数据保存在SQL Server的临时表中,我就可以在数据库中轻松地执行任何操作,并且丢失值不再是一个问题。