在子查询中使用MAX()+ 1插入T-SQL不会增加,替代方案?

Kor*_*rsG 13 t-sql sql-server sql-server-2008 batch-insert

我有一个查询,我需要"批量"插入行与没有标识的主键的表.

--TableA
--PK int (Primary key, no-identity)
--CustNo int
INSERT INTO TableA (PK,CustNo)
  SELECT (SELECT MAX(PK)+1 AS PK FROM TableA), CustNo
  FROM Customers
Run Code Online (Sandbox Code Playgroud)

(简化示例 - 请不要评论可能的并发问题:-))

问题是它没有为每个"处理的"行增加PK,并且我得到主键违规.

我知道如何使用游标/ while循环,但我想避免这种情况,并以基于集合的方式解决它,如果这甚至可能的话?

(运行SQL Server 2008 Standard)

Mic*_*uen 25

Declare @i int;

Select @i = max(pk) + 1 from tablea;

INSERT INTO TableA (PK, custno)
Select row_number() over(order by custno) + @i  , CustNo
FROM Customers
Run Code Online (Sandbox Code Playgroud)

  • 小心竞争条件. (2认同)

小智 7

给Michael Buen +1,但我有一个建议:

表"tablea"可以为空,所以我们应该写:

Select @i = isnull(max(pk),0) + 1 from tablea;
Run Code Online (Sandbox Code Playgroud)

这将在尝试使用此代码时防止出现null错误.