我正在处理一个需要在带有标识列的表中重新插入元素的存储过程。这样做,对于某些行,它需要指定标识列,对于其他一些行,最好由标识列生成新的标识值。是否可以在单个语句中而不是IF-ELSE
中执行此操作?
这是我现在的解决方案(其中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 :(得分:1)
我强烈建议您不要在日常使用中使用标识插件。标识插入要求用户拥有该表或对表具有更改权限,这对于一般用户来说不是一个好主意。存在标识插入功能以允许数据迁移,并且通常应该仅在维护类型的模式中使用,而不是应该作为常规事件发生的事情。
您可以在表格中添加ActiveFlag
字段吗?然后,您可以在(ActiveFlag, id_column)
上创建聚簇索引。这将为您提供隔离数据以便快速访问新旧数据的好处。当表格过期或重新焕发活力时,您也不会在表格之间来回移动数据;它只是对标志的字段更新。保持两个单独的表似乎增加了更多的工作,几乎没有任何好处。
答案 1 :(得分: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;
您可能需要使用事务来处理并发问题。