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

时间:2011-08-08 15:42:56

标签: sql-server tsql 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

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

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

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

(运行SQL Server 2008 Standard)

5 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:7)

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

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

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

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

答案 2 :(得分:4)

你看到的问题是它们都得到相同的行号,每行的最大值(PK)+1是相同的。

尝试将其转换为Max(PK) + Row_number()

我正在研究为什么你知道这是一个坏主意等等,你的问题是为了得到答案而简化,而不是你希望如何解决问题。

答案 3 :(得分:3)

你可以;

;with T(NPK, CustNo) as (
  select row_number() over (order by CustNo), CustNo from Customers
)
insert into TableA (PK, CustNo)
  select NPK, custno from T
order by CustNo 

答案 4 :(得分:1)

我有一个关于你哥们的建议,一个关于SQL的更好的做法是说要使用SEQUENCE,然后猜猜是什么,非常容易做到这一点,只需复制并粘贴我的:

  

创建序列SEQ_TABLEA作为整数       从1开始       增加1       MAXVALUE 2147483647       MINVALUE 1       没有循环

并使用如下:

  

INSERT INTO TableA(PK,CustNo)VALUES(SEQ_TABLEA.NEXTVAL,123)

希望这个提示能够帮助你!