14

我有一个查询,我需要将行“批量”插入到具有没有标识的主键的表中。

--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 标准版)

4

5 回答 5

28
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
于 2011-08-08T15:50:30.243 回答
10

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

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

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

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

于 2011-08-08T16:34:54.223 回答
4

如您所见,问题是它们都获得相同的行号,每行的 max(PK) +1 都是相同的。

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

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

于 2011-08-08T15:46:29.783 回答
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 
于 2011-08-08T15:51:53.473 回答
1

哥们,我有一个建议给你,一个更好的 SQL 实践说使用 SEQUENCE,你猜怎么着,做起来很容易,只需复制并粘贴我的:

CREATE SEQUENCE SEQ_TABLEA AS INTEGER START WITH 1 INCREMENT BY 1 MAXVALUE 2147483647 MINVALUE 1 NO CYCLE

并像这样使用:

插入表 A (PK,CustNo) 值 (SEQ_TABLEA.NEXTVAL,123)

希望这个技巧可以帮助你!

于 2015-06-18T14:12:35.427 回答