我有一个查询,我需要“批量”将行插入到一个没有标识的主键的表中。
--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)
答案 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)
希望这个提示能够帮助你!