2014-03-19 255 views
0

我正在將數據庫從MS Access移動到MS SQL Server 2012.我的問題涉及我們需要爲SQL Server數據庫解決的數據問題。我們有一個主MS Access表,它生成一個整數鍵,然後在其他幾個表中使用。在Access中,當創建新記錄時,列自動增量。我們遇到的問題是Access表格列中存在空白(記錄被刪除(不明智))。似乎SQL表版本的SQL Server版本的解決方案是將該列的表設置爲PRIMARY和UNIQUE,而不使用IDENTITY值。這意味着我們不會再獲得一個自動增加的號碼。我們必須編寫一些代碼來使用帶有MAX()的SELECT來創建該編號。有沒有更好的方法來解決這個問題?將MS Access從MS Access遷移到MS SQL Server

+1

我以爲你可以改變列到身份一旦它在SQL Server?你嘗試過嗎? –

+0

請不要將身份列與序號混淆。您不應該對身份專欄有任何興趣,除了它是唯一的。 – Fionnuala

回答

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

使用這種技術,您可以在SQL Server中,在沒有標識列表B的Access版本轉換爲temp_TableB。然後用IDENTITY列在SQL Server中創建一個真正的TableB。

,那麼你可以

SET IDENTITY_INSERT TableB ON 

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

SET IDENTITY_INSERT TableB OFF

現在你已經表B正確填寫,並準備創建下一個自動遞增的標識值。

+0

謝謝KnowKungFoo SET IDENTITY_INSERT ON/OFF是答案。我在桌上測試了它,它完全符合我的要求。 – billmac1