2015-05-19 52 views
2

我正在處理需要重新插入具有標識列的表中的元素的存儲過程。這樣做,對於某些行需要指定標識列,對於其他行,最好是由標識列生成新的標識值。是否有可能在一個陳述中做到這一點,而不是IF-ELSE如何選擇使用IDENTITY_INSERT或在單個語句中提供一個

這裏的解決方案,我有現在(其中id_column是標識列):

DECLARE @id_to_insert INT, @val1 INT, @val2 INT, @val3 INT, @val4 INT; 

-- Do some things 

IF @id_to_insert IS NOT NULL 
BEGIN 
    SET IDENTITY_INSERT dbo.table1 ON; 

    INSERT INTO dbo.table1 (id_column, col1, col2, col3, col4, col4) 
    VALUES (@id_to_insert, @val1, @val2, @val3, @val4); 

    SET IDENTITY_INSERT dbo.table1 OFF; 
END 
ELSE 
BEGIN 
    INSERT INTO dbo.table1 (col1, col2, col3, col4, col4) 
    VALUES (@val1, @val2, @val3, @val4); 
END 

正如你可以看到,這兩個語句都非常相似,這將是有趣不要有重複幾乎相同插。

編輯:

該表保存當前聯繫人數據。我將存檔/刪除的聯繫人移動到另一個表中,以便我們保持此表乾淨並且沒有不需要的數據,但我有時可能會將它們還原到當前數據表。如果可能,我想保留聯繫人在存檔/刪除之前的身份。如果不可能(身份已被重新分配),我需要生成一個新的身份。

+0

當然,我有一個條件來打開或關閉'IDENTITY_INSERT',這是我的想法,但無法讓INSERT部分在單個查詢中適用於這兩種情況。 – MaxiWheat

+1

你所擁有的就像你寫的要做的一樣。真正的問題是如何重新設計數據庫,以便首先避免身份插入。身份插入要求用戶擁有該表或對該表擁有更改權限,這對於一般用戶來說不是一個好主意。身份插入功能的存在允許數據的遷移,通常只能用於維護類型的模式,而不應該作爲常規事件發生。添加上下文到您的問題,也許我們可以幫助您消除需求。 –

+0

@BrianPressler我用更多的上下文信息編輯了我的問題 – MaxiWheat

回答

1

我強烈建議不要在一般的日常使用中使用身份插入。身份插入要求用戶擁有該表或對該表擁有更改權限,這對於一般用戶來說不是一個好主意。身份插入功能的存在允許數據的遷移,通常只能用於維護類型的模式,而不應該作爲常規事件發生。

您是否可以將ActiveFlag字段添加到您的表中?然後您可以在(ActiveFlag, id_column)上創建聚集索引。這將爲您提供隔離數據以便快速訪問新舊數據的好處。您也不會在表格之間來回移動數據,因爲它們會變得過期或重新煥發活力;這只是對該標誌的現場更新。保持兩個獨立的表格似乎是增加了更多的工作,但卻沒有多少好處。

0

關於你能做的最接近的事是這樣的僞代碼:

IF @id_to_insert IS NULL 
    SET @id_to_insert = SELECT [the next identity value] FROM MyTable; 

SET IDENTITY_INSERT dbo.table1 ON; 

INSERT INTO dbo.table1 (id_column, col1, col2, col3, col4, col4) 
VALUES (@id_to_insert, @val1, @val2, @val3, @val4); 

SET IDENTITY_INSERT dbo.table1 OFF; 

而且你可能會需要使用事務處理併發問題。

+0

我不確定你的意思。刪除標識屬性?我假設還有其他輸入點需要它。 –

相關問題