我正在處理需要重新插入具有標識列的表中的元素的存儲過程。這樣做,對於某些行需要指定標識列,對於其他行,最好是由標識列生成新的標識值。是否有可能在一個陳述中做到這一點,而不是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
正如你可以看到,這兩個語句都非常相似,這將是有趣不要有重複幾乎相同插。
編輯:
該表保存當前聯繫人數據。我將存檔/刪除的聯繫人移動到另一個表中,以便我們保持此表乾淨並且沒有不需要的數據,但我有時可能會將它們還原到當前數據表。如果可能,我想保留聯繫人在存檔/刪除之前的身份。如果不可能(身份已被重新分配),我需要生成一個新的身份。
當然,我有一個條件來打開或關閉'IDENTITY_INSERT',這是我的想法,但無法讓INSERT部分在單個查詢中適用於這兩種情況。 – MaxiWheat
你所擁有的就像你寫的要做的一樣。真正的問題是如何重新設計數據庫,以便首先避免身份插入。身份插入要求用戶擁有該表或對該表擁有更改權限,這對於一般用戶來說不是一個好主意。身份插入功能的存在允許數據的遷移,通常只能用於維護類型的模式,而不應該作爲常規事件發生。添加上下文到您的問題,也許我們可以幫助您消除需求。 –
@BrianPressler我用更多的上下文信息編輯了我的問題 – MaxiWheat