【问题标题】:SSIS: "Failure inserting into the read-only column <ColumnName>"SSIS:“插入只读列 <ColumnName> 失败”
【发布时间】:2009-12-18 22:49:09
【问题描述】:

我有一个 Excel 源进入 OLE DB 目标。我将数据插入到具有处理所有插入的 INSTEAD OF 触发器的视图中。当我尝试执行包时收到此错误:

“插入只读列ColumnName失败”

我该怎么做才能让 SSIS 知道这个视图可以安全插入,因为有一个 INSTEAD OF 触发器可以处理插入?

编辑(附加信息):
一些更多的附加信息。我有一个平面文件正在插入到规范化数据库中。我最初的问题是如何获取一个平面文件并将该数据插入到多个表中,同时跟踪所有主/外键关系。我的解决方案是创建一个模仿平面文件结构的视图,然后在该视图上创建一个 INSTEAD OF 触发器。在我的 INSTEAD OF 触发器中,我将处理维护表之间所有关系的逻辑

我的视图看起来像这样。

CREATE VIEW ImportView
AS
SELECT
CONVERT(varchar(100, NULL) AS CustomerName,
CONVERT(varchar(100), NULL) AS Address1,
CONVERT(varchar(100), NULL) AS Address2,
CONVERT(varchar(100), NULL) AS City,
CONVERT(char(2), NULL) AS State,
CONVERT(varchar(250), NULL) AS ItemOrdered,
CONVERT(int, NULL) AS QuantityOrdered
...

我永远不需要从这个视图中选择,我只用它从我收到的这个平面文件中插入数据。我需要以某种方式告诉 SQL Server 这些字段并不是真正只读的,因为此视图上有一个 INSTEAD OF 触发器。

【问题讨论】:

    标签: sql-server sql-server-2008 ssis


    【解决方案1】:

    此外,如果您的列是 IDENTITY,您可以在 OLEDB 目标编辑器中选中 Keep Identity 复选框

    【讨论】:

      【解决方案2】:

      这不是一个理想的解决方案,但我找到了解决问题的方法。由于 SSIS 抱怨插入到我的视图中,我创建了一个与我的视图具有完全相同结构的表。然后,在该表上的 INSTEAD OF 触发器中,我只是将发往该表的信息插入到视图中。这在导入过程中又增加了一步,但没什么大不了的。

      【讨论】:

        【解决方案3】:

        为什么列是“只读”的?您可以发布视图和基础表的架构吗?专栏是IDENTITY?视图中有WITH CHECK OPTION 吗?它是派生(计算)列吗?

        更新

        我现在看到,视图的应用有点不寻常,也许存储过程会是更合适的选择——DB 中的存储过程和 SSIS 中的 OLEDB 命令。

        如果您不使用触发器,而是使用从临时表到“最终”表的批量插入,那么以表作为目标的最终解决方案实际上更快。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-23
          • 1970-01-01
          • 1970-01-01
          • 2022-08-15
          • 1970-01-01
          • 2015-07-17
          • 2021-01-11
          • 1970-01-01
          相关资源
          最近更新 更多