我复制oldDatabase
为newDatabase
. 修改newDatabase
的架构。
同时,oldDatabase
的数据正在处理和更新中。
我想将oldDatabase
的数据复制到newDatabase
.
我所做的是:
- 清理数据
newDatabase
- 生成仅数据脚本
oldDatabase
- 在
newDatabase
.
我收到了很多错误消息,例如:
Cannot insert explicit value for identity column in table 'MyTableName' when
IDENTITY_INSERT is set to OFF.
Invalid column name 'MyColumnName'.
Violation of PRIMARY KEY constraint 'PK_MyTableName'. Cannot insert duplicate
key in object 'dbo.MyTableName'.
一些表和行数据受到影响。但是,具有上述错误的表不受影响。我该如何解决?有没有最好的方法来制作这些东西?
附言
我使用这个命令运行我的脚本,
sqlcmd -S myServerName -U userName -P passowrd -i PathOfMyScriptFile
您的脚本正在做的是明确尝试将数据插入 IDENTITY 列。您需要做以下两件事之一:在插入之前将该表的 IDENTITY_INSERT 设置为 ON,或者重新编写 INSERT 语句,使其不使用值指定 IDENTITY 列。
从外观上看,您遇到了三种不同类型的问题。
您有身份列。对于具有标识列的表,您有三个选择。首先,当您进行插入时,请排除身份列。其次从目标表的列中删除标识属性。第三次使用identity_insert。要使用 identity_insert,您首先为表打开它。
然后你做你的插入。注意:您必须列出插入中的所有列。
不是
最后但并非最不重要的一点是确保再次关闭 identity_insert。对于给定的连接,一次只能为一个表打开 Identity_insert。
这是插入标识列的一个很好的演练。
你说你改变了'newDatabase'的结构。那么我的猜测是你删除了'MyColumnName'。要么从插入中排除它,要么重新添加列。您要么需要确保结构
newDatabase
匹配oldDatabase
,要么考虑插入的差异。最后但并非最不重要的一点是,您将数据插入到
newDatabase
数据已经存在的情况下。或者至少主键值已经存在于newDatabase.MyTableName
. 我的建议是,如果您有任何机会进行更新以及插入将您的INSERT
语句更改为MERGE
语句。否则,在您的语句中添加一个WHERE NOT EXISTS
或类似于该语句的内容,以排除任何主键已存在于.SELECT
INSERT
newDatabase.MyTableName