SSIS:“插入只读列<columnname>”</columnname>失败

时间:2009-12-18 22:49:10

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

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

  

“插入只读列ColumnName失败”

alt text

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

编辑(附加信息):
还有一些额外的信息。我有一个插入标准化数据库的平面文件。我最初的问题是如何获取平面文件并将该数据插入到多个表中,同时跟踪所有主/外键关系。我的解决方案是创建一个VIEW,模仿平面文件的结构,然后在该视图上创建一个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触发器。

3 个答案:

答案 0 :(得分:3)

此外,如果您的列为Keep Identity

,您只需在OLEDB目标编辑器中选择IDENTITY复选框即可

答案 1 :(得分:0)

为什么列“只读”?你能发布视图和基础表的模式吗?列IDENTITY?视图上有WITH CHECK OPTION吗?它是派生(计算)列吗?

<强>更新

我现在看到,视图有点不寻常的应用,也许存储过程可能是更合适的选择 - 数据库中的存储过程和SSIS中的OLEDB命令。

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

答案 2 :(得分:0)

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

相关问题