[英]INSERT INTO statement that copies rows and auto-increments non-identity key ID column
給定一個包含三列的表
我正在嘗試編寫單個SQL INSERT INTO語句,該語句將具有一個GroupID的每一行的副本復制到新的GroupID中。
示例開始表:
ID | GroupID | SomeValue
------------------------
1 | 1 | a
2 | 1 | b
我運行一個簡單的INSERT INTO語句后的目標:
ID | GroupID | SomeValue
------------------------
1 | 1 | a
2 | 1 | b
3 | 2 | a
4 | 2 | b
我以為我可以這樣做:
INSERT INTO MyTable
( [ID]
,[GroupID]
,[SomeValue]
)
(
SELECT (SELECT MAX(ID) + 1 FROM MyTable)
,@NewGroupID
,[SomeValue]
FROM MyTable
WHERE ID = @OriginalGroupID
)
這會導致PrimaryKey違規,因為它最終會多次重復使用相同的Max(ID)+1值。
我是否只能在T-SQL WHILE語句中使用一堆具有遞增計數器值的INSERT語句?
我也沒有選擇將ID轉換為自動遞增標識列,因為這會破壞我沒有源代碼的代碼。
而不是+ 1
,添加行號。 我還修復了WHERE子句中的錯誤(應該是GroupID =
,而不是ID =
):
INSERT INTO MyTable
( [ID]
,[GroupID]
,[SomeValue]
)
(
SELECT
(SELECT MAX(ID) FROM MyTable) + ROW_NUMBER() OVER (ORDER BY GroupId),
@NewGroupID,
[SomeValue]
FROM MyTable
WHERE GroupID = @OriginalGroupID
)
WITH q AS
(
SELECT *,
(
SELECT MAX(id)
FROM mytable
) + ROW_NUMBER() OVER () AS nid
FROM mytable
WHERE groupID = 1
)
INSERT
INTO mytable (id, groupid, somevalue)
SELECT nid, 2, somevalue
FROM q
用這個:
INSERT INTO MyTable
( [ID]
,[GroupID]
,[SomeValue]
)
SELECT ROW_NUMBER() OVER() + X.MaxID
,@NewGroupID
,[SomeValue]
FROM MyTable
CROSS JOIN (SELECT MAX(ID) AS MaxID FROM MyTable) X
WHERE GroupID = @OriginalGroupID
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.