从Access导入到SQL Server仅适用于集合中的第一个表

时间:2010-12-16 13:53:59

标签: sql-server ms-access

我正在尝试将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查询后,第三个只是两者之间的差异。

2 个答案:

答案 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