将表从MS Access迁移到MS SQL Server

时间:2014-03-19 18:50:24

标签: sql-server ms-access

我将数据库从MS Access移动到MS SQL Server 2012.我的问题涉及我们需要为SQL Server数据库解决的数据问题。我们有一个主MS Access表,它生成一个整数键,然后在其他几个表中使用。在Access中,列创建新记录时自动增量。我们遇到的问题是,Access表格列中存在空白,其中记录被(不明智地)删除。似乎他的表的SQL Server版本的解决方案是使用该列设置为PRIMARY和UNIQUE来迁移表,而不使用IDENTITY值。这意味着我们将不再获得自动增加的数字。我们必须编写一些代码来使用SELECT with MAX()创建该编号。有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:2)

您有TableA当前维护使用的主键是相关表。您希望TableB现在控制此主键的创建。我不明白为什么您不能继续使用TableB上的自动递增主键来管理主键的创建。以前的价值观存在差距并不重要。 SQL Server有办法解决这个问题。

您无法将表中的现有列转换为IDENTITY,但您可以在SQL Server中使用IDENTITY列创建表,关闭IDENTITY函数,使用您自己的值填充它(空白和所有) ,然后重新打开IDENTITY功能。

来自IDENTITY_INSERT的文档:

-- Create products table.
CREATE TABLE products (id int IDENTITY PRIMARY KEY, product varchar(40))
GO
-- Inserting values into products table.
INSERT INTO products (product) VALUES ('screwdriver')
INSERT INTO products (product) VALUES ('hammer')
INSERT INTO products (product) VALUES ('saw')
INSERT INTO products (product) VALUES ('shovel')
GO

-- Create a gap in the identity values.
DELETE products 
WHERE product = 'saw'
GO

SELECT * 
FROM products
GO

-- Attempt to insert an explicit ID value of 3;
-- should return a warning.
INSERT INTO products (id, product) VALUES(3, 'garden shovel')
GO
-- SET IDENTITY_INSERT to ON.
SET IDENTITY_INSERT products ON
GO

-- Attempt to insert an explicit ID value of 3
INSERT INTO products (id, product) VALUES(3, 'garden shovel').
GO

-- SET IDENTITY_INSERT to OFF.
SET IDENTITY_INSERT products OFF
GO

SELECT * 
FROM products

使用此技术,您可以将SQLB的Access版本转换为SQL Server中的temp_TableB,其中没有标识列。然后在SQL Server中使用IDENTITY列创建一个真正的TableB。

然后你可以

SET IDENTITY_INSERT TableB ON

INSERT INTO TableB ( {columnlist} )
SELECT * from temp_TableB

SET IDENTITY_INSERT TableB OFF

现在您已正确填充TableB并准备创建下一个自动递增的IDENTITY值。