SSIS 无法将数据插入到具有计算列的表中



我有一个 SSIS 流将数据插入表中。此流过去工作正常,直到更新数据模型并添加计算列。现在,当我尝试加载数据时,出现以下错误:

SQL Server 错误消息 - 消息 271 - 无法修改列",因为它是计算列或是 UNION 运算符的结果。

我在这里找到了此错误消息的良好解释: SQL Server 错误消息 - 消息 271

我之所以联系 StackOverflow,是因为此列实际上未映射到我的 SSIS 流中。这意味着我的 OLEDB 目标组件知道列的存在,但其映射设置为<ignore column>。这是我处理其他列(例如生成的 ID)的方式,它总是工作正常。

因此,问题来了:为什么我会收到此错误消息?

我曾经想到 SSIS 可能会自动生成 SQL 插入语句,将null值映射到此计算列。如果是这种情况,有没有办法迫使 SSIS 完全忽略列的存在?

我认为问题是您在将数据加载到 OLE DB 目标时使用快速加载选项,请尝试使用常规表加载,因为此问题可能是在批量插入操作期间引起的。

还要确保为计算列生成值的表达式不会在插入的行中被计算为NULL

从 SQL Server 2016 升级到 2019 后,我遇到了同样的问题,其中包含一些包含计算列(设置为持久化)的目标表。

由于每个目标表大约 1 TB,因此重建不是真正的选择(或者只是最后的手段)。创建另一个相同的表并将其用作目标无济于事。

我通过创建一个视图(v__insert_target_from_ssis)绕过了这个问题,该视图只不过是从目标表中做了一个愚蠢的 SELECT(没有任何连接、计算、where 条件......在 SSIS 中将此虚拟视图用作目标后,导入作业将再次成功运行。

另一种解决方案是从表中的计算列中删除PERSISTED(或者在我的例子中是我为测试目的而创建的空副本)。这可以通过

ALTER TABLE dbo.big_dwh_table ALTER COLUMN I_am_computed DROP PERSISTED

在此更改之后,我也能够使用 SSIS 插入到此表中(但它不是原始表的选项,因为计算列的使用量很大)

最新更新