INSERT INTO语句,用于复制行和自动递增非标识键ID列

Amo*_*n17 9 sql t-sql

给定一个包含三列的表

  1. ID(主键,非自动增量)
  2. 组ID
  3. someValue中

我正在尝试编写单个SQL INSERT INTO语句,该语句将具有一个GroupID的每一行的副本复制到新的GroupID中.

示例开始表:

ID | GroupID | SomeValue
------------------------
1  |    1    |    a
2  |    1    |    b
Run Code Online (Sandbox Code Playgroud)

我运行一个简单的INSERT INTO语句后的目标:

ID | GroupID | SomeValue
------------------------
1  |    1    |    a
2  |    1    |    b
3  |    2    |    a
4  |    2    |    b
Run Code Online (Sandbox Code Playgroud)

我以为我可以这样做:

INSERT INTO MyTable
(       [ID]
       ,[GroupID]
       ,[SomeValue]
)
(
SELECT (SELECT MAX(ID) + 1 FROM MyTable)
       ,@NewGroupID
       ,[SomeValue]
 FROM MyTable
 WHERE ID = @OriginalGroupID
)
Run Code Online (Sandbox Code Playgroud)

这会导致PrimaryKey违规,因为它最终会多次重复使用相同的Max(ID)+1值.

我是否只能在T-SQL WHILE语句中使用一堆具有递增计数器值的INSERT语句?

我也没有选择将ID转换为自动递增标识列,因为这会破坏我没有源代码的代码.

Mar*_*ers 11

而不是+ 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
)
Run Code Online (Sandbox Code Playgroud)