SQL Server导入CSV报错:无法插入只读列'id',求类似SSIS报错解决方法
解决SQL Server/SSIS导入CSV时“只读列插入失败”的问题
嘿,这个问题我碰到过好多次了,本质原因很明确:你试图往只读列(比如自增ID、计算列,或者被设置为只读的列)里写入数据,但这类列的值是数据库自动维护的,不允许外部输入。下面分两种场景给你具体的解决步骤:
场景1:用SQL Server导入向导从CSV导入数据
- 重新启动导入向导,当走到「选择源表和源视图」这一步时,点击编辑映射按钮。
- 在映射窗口里找到报错的列(比如
id):- 如果这是自增列(设置了
IDENTITY(1,1)),把对应的「输入列」设置为<忽略>——这样导入时就不会往这个列写数据,数据库会自动生成自增值。 - 如果是计算列或者其他只读列,同样把输入列设为忽略,确保不尝试向该列插入数据。
- 如果这是自增列(设置了
- 确认映射设置后继续完成导入流程,报错应该就会消失。
场景2:SSIS包执行时出现该报错
- 打开你的SSIS包,找到对应的数据流任务,双击进入数据流编辑器。
- 找到连接数据源和目标表的组件(比如OLE DB目标),双击打开编辑窗口。
- 切换到「映射」选项卡,定位到报错的
<ColumnName>列:- 如果是自增列,确保该列没有映射到源数据的任何列(也就是目标列对应的输入列留空或选择忽略)。
- 如果是其他只读列,同样取消该列的映射,避免源数据写入这个列。
- 特殊情况:如果你需要保留CSV里的原有ID值(比如数据迁移场景),可以开启
IDENTITY_INSERT:在OLE DB目标的高级编辑窗口中,找到「访问模式」对应的设置,勾选「保留标识」;或者在执行导入前手动运行SET IDENTITY_INSERT YourTableName ON(导入完成后记得再关闭:SET IDENTITY_INSERT YourTableName OFF)。
额外注意事项
- 提前检查目标表的列属性:确认报错列是不是自增列、计算列,或者有没有被设置为只读权限,这些都会导致无法外部写入。
- 如果CSV里本身包含了只读列的数据,导入时必须忽略该列的映射,否则必然会触发冲突报错。
内容的提问来源于stack exchange,提问作者Joshua Simon Bloom




