SQL Server 如何使用ADF复制活动将csv文件中缺少的值转换为数据库空值?

yebdmbv4  于 2022-12-03  发布在  其他
关注(0)|答案(3)|浏览(151)

我在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可以理解的空值。

rsaldnfx

rsaldnfx1#

您可以使用数据流活动将值设置为NULL。

  • 在数据流中,源数据如下图所示。

*采用派生列转换,表达式为iifNull(id,toString(null()))

*结果

zzlelutf

zzlelutf2#

您是否在复制活动中尝试过此选项?

这个应该可以

ulydmbyx

ulydmbyx3#

经过多次尝试,下面是我对这个问题的解决方案。2虽然不是很理想,但是很有效。3解决方案是我在SQL Server中创建了一个永久临时表,然后使用复制活动将CSV数据传输到这个临时表中。4诀窍是在复制活动中使用插入选项(见图)而不是使用存储过程,这是我以前试图做的。

感觉在复制活动和SQL服务器之间有某种内部机制来处理缺失的值。一旦将数据保存在SQL Server的临时表中,我就可以在数据库中轻松地执行任何操作,并且丢失值不再是一个问题。

相关问题