我正在尝试在表中插入新行,该表是除标识符外的另一行的精确副本。以前我没有这个问题,因为有一个ID栏没有自动填充。所以我可以像这样复制一行
INSERT INTO table1 SELECT * FROM table1 WHERE Id = 5
然后像这样手动更改ID
WITH tbl AS (SELECT ROW_NUMBER() OVER (PARTITION BY Id ORDER BY Id) AS RNr, Id
FROM table1 WHERE Id = 5
UPDATE tbl SET Id = (SELECT MAX(Id) FROM table1) + 1
WHERE RNr = 2
最近,列ID已更改为不手动填充(我也希望更好)。但这导致错误,当IDENTITY_INSERT
为假时,我显然无法填充该列。不幸的是,我无权在声明之前和之后使用SET IDENTITY_INSERT IdentityTable ON/OFF
,无论如何我也想避免这样做。
[我正在寻找一种方法,以插入不包括ID列的整个行,而不在INSERT
和SELECT
语句(它们很多)中互相命名。
在ID最大值以下的代码中加一,因此不会侵犯您的完整性。
insert into table1
select a.Top_ID, Column2, Column3, ColumnX
from table1 t1
outer apply (select max(id_column) + 1as Top_ID from table1) as a
where t1.Id = 1
好的,我找到了使用临时表的方法
SELECT * INTO #TmpTbl
FROM table1 WHERE Id = 5;
ALTER TABLE #TmpTbl
DROP COLUMN Id;
INSERT INTO table1 SELECT * FROM #TmpTbl;
DROP TABLE #TmpTbl