我正在尝试将MsAccess 2007数据导入SQL Server数据库。这比较早,相同的代码,相同的机器,除了SQL Server Express 2005.在一些无关的问题后,我转换到2008,现在我无法加载数据。
它是在Access中运行的VBA代码,首先执行一个名为ClearDB的存储过程,它擦除每个表。那仍然有效。然后它遍历所有表,由于关系约束而维持特定的顺序。对于每个表,代码执行以下三个查询:
SET IDENTITY_INSERT TableOfZones ON
INSERT INTO dbo_TableOfZones SELECT Jet_TableOfZones.* FROM Jet_TableOfZones
SET IDENTITY_INSERT TableOfZones OFF
IDENTITY_INSERT
查询是直通的,插入是本地的。这最近才开始仅用于第一个表,然后崩溃声称由于密钥违规而没有插入任何记录。它始终是第一个工作的表,无论哪个表都是,只要它不是一个需要从另一个表中匹配记录就已经到位的表。听起来像索引等完全正常的搞砸了,除非我让它静置一会儿(10-15分钟),它突然再次工作,一张桌子。那个插件工作,然后它炸弹下一个。再一次,如果我让它静置一段时间,那么下一个会突然工作并在那之后崩溃。
我必须使用IDENTITY_INSERT
选项,因为我使用已创建的关系导入现有数据,否则我只是让SQL Server生成自己的ID列。
这是最新的尝试:
SET IDENTITY_INSERT TableOfZones ON
INSERT INTO dbo_TableOfZones(ZoneAutoID, Zone) SELECT Jet_TableOfZones.ZoneAutoID, Jet_TableOfZones.Zone FROM Jet_TableOfZones 119
SET IDENTITY_INSERT TableOfZones OFF
119 119 0
SET IDENTITY_INSERT TableOfSystems ON
INSERT INTO dbo_TableOfSystems(SystemAutoID, System) SELECT Jet_TableOfSystems.SystemAutoID, Jet_TableOfSystems.System FROM Jet_TableOfSystems 0
SET IDENTITY_INSERT TableOfSystems OFF
221 0 221
相同的结果,第一次插入工作正常,第二次炸弹。第一个数字是源表中的记录计数,第二个是目标表的记录计数,执行Insert查询后,第三个只是两者之间的差异。
答案 0 :(得分:0)
在SQL Server 2008中,为了使用IDENTITY INSERT
,您需要在select和insert中指定显式字段列表,即:
SET IDENTITY_INSERT TableOfZones ON
INSERT INTO dbo_TableOfZones (
ID_Field,
field1,
field2,
field3...)
SELECT Jet_TableOfZones.IDField,
Jet_TableOfZones.field1,
Jet_TableOfZones.field2,
Jet_TableOfZones.field3...
FROM Jet_TableOfZones
SET IDENTITY_INSERT TableOfZones OFF
我认为来自Access的连接会受到相同的约束。
答案 1 :(得分:0)
好的,这看起来更好的方法。对评论中的汤感到抱歉。这是这次发出的命令的副本。我想知道是否我必须为每个字段命名源表?我试试看......
SET IDENTITY_INSERT TableOfZones ON
INSERT INTO dbo_TableOfZones(ZoneAutoID, Zone) SELECT ZoneAutoID, Zone FROM Jet_TableOfZones 119
SET IDENTITY_INSERT TableOfZones OFF
119 119 0
SET IDENTITY_INSERT TableOfSystems ON
INSERT INTO dbo_TableOfSystems(SystemAutoID, System) SELECT SystemAutoID, System FROM Jet_TableOfSystems 0
SET IDENTITY_INSERT TableOfSystems OFF
221 0 221