如何用增量变量将行复制到同表并生成拼接式主键?
如何用增量变量复制行并更新主键列?
你的思路方向是对的,但原代码里的@x是个全局变量,只会递增一次,所以所有插入的行都会用同一个主键值(50487001),这肯定会触发主键冲突,而且也达不到你要的逐行递增的效果。
要实现逐行生成递增的主键,我们可以用ROW_NUMBER()函数来生成每行对应的增量序号,这样就能和原数据的行数一一对应,生成连续的主键值。
修改后的代码
USE [Target Database] GO BEGIN INSERT INTO [dbo].[Target_Table] ([Primary_Key],[Col1],[Col2]) SELECT CONCAT('50487', FORMAT(ROW_NUMBER() OVER (ORDER BY [Primary_Key]), '000')) AS [Primary_Key], [Col1], [Col2] FROM [dbo].[Target_Table] WHERE [Col1] = 54706 END
代码解释
ROW_NUMBER() OVER (ORDER BY [Primary_Key]):按照原表主键的顺序,为筛选出的每一行生成一个从1开始的连续序号,这样原表的第1行对应序号1,第2行对应序号2,以此类推。FORMAT(..., '000'):把序号格式化为三位数字,不足三位的前面补0,比如1变成001,50变成050。CONCAT('50487', ...):把前缀50487和格式化后的序号拼接,生成你需要的新主键。
效果验证
原数据:
| Primary_Key | Col1 | Col2 |
|---|---|---|
| 50409001 | 54706 | Test1 |
| ... | ... | ... |
| 50409050 | 54706 | Test2 |
执行代码后,插入的新数据会是:
| Primary_Key | Col1 | Col2 |
|---|---|---|
| 50487001 | 54706 | Test1 |
| ... | ... | ... |
| 50487050 | 54706 | Test2 |
这样就完美实现了你要的需求,既复制了指定行,又生成了连续递增的新主键。
内容的提问来源于stack exchange,提问作者Tousif Md. Amin Faisal
相关产品推荐
相关产品推荐

