如何在SQL Server中生成带连续编号的分支与用户数据?
实现方案:为SQL Server的usersTable批量生成分支用户数据
嘿,这个需求用CTE(公共表表达式)来实现就非常高效,不用手动写几千条INSERT语句,逻辑清晰还容易维护。下面给你两种实用的实现方式,你可以根据自己的场景选择:
方法一:递归CTE生成分支与用户序列
这种方法通过递归分别生成分支编号和每个分支下的用户序号,再交叉组合得到所有数据:
WITH BranchNumbers AS ( -- 递归生成1到700的分支编号 SELECT 1 AS BranchNum UNION ALL SELECT BranchNum + 1 FROM BranchNumbers WHERE BranchNum < 700 ), UserNumbers AS ( -- 为每个分支生成3个用户的本地序号(1-3) SELECT 1 AS UserSeq UNION ALL SELECT UserSeq + 1 FROM UserNumbers WHERE UserSeq < 3 ) INSERT INTO usersTable (users, branch) SELECT -- 生成全局连续的用户名称,格式为userXXX(XXX是带前导零的3位编号) 'user' + RIGHT('000' + CAST((b.BranchNum - 1)*3 + u.UserSeq AS VARCHAR(3)), 3) AS users, -- 生成分支名称,格式为branchXXX 'branch' + RIGHT('000' + CAST(b.BranchNum AS VARCHAR(3)), 3) AS branch FROM BranchNumbers b CROSS JOIN UserNumbers u ORDER BY b.BranchNum, u.UserSeq;
代码说明:
BranchNumbers:递归生成1到700的数字,对应branch001到branch700的序号。UserNumbers:递归生成1到3的数字,代表每个分支下的3个用户。- 交叉连接后,通过
(b.BranchNum - 1)*3 + u.UserSeq计算出全局连续的用户编号,再用RIGHT('000' + ..., 3)保证编号是3位带前导零的格式。 - 最后将组合好的用户和分支名称插入到
usersTable中,id列作为自增列会自动填充。
方法二:利用系统视图生成分支序列
如果觉得递归CTE不够直观,也可以用系统视图生成足够多的行,再筛选出700个分支:
-- 定义每个分支下的3个用户序号 WITH UserSeq AS ( SELECT 1 AS Seq UNION ALL SELECT 2 UNION ALL SELECT 3 ), BranchSeq AS ( -- 通过系统视图交叉连接生成足够多的行,取前700个作为分支编号 SELECT TOP 700 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Num FROM sys.all_columns ac1 CROSS JOIN sys.all_columns ac2 ) INSERT INTO usersTable (users, branch) SELECT 'user' + RIGHT('000' + CAST((bs.Num -1)*3 + us.Seq AS VARCHAR(3)), 3), 'branch' + RIGHT('000' + CAST(bs.Num AS VARCHAR(3)), 3) FROM BranchSeq bs CROSS JOIN UserSeq us ORDER BY bs.Num, us.Seq;
代码说明:
UserSeq:直接用UNION ALL生成3个用户序号,简单直接。BranchSeq:利用sys.all_columns的交叉连接生成大量行,再通过ROW_NUMBER()生成1到700的分支编号(ORDER BY (SELECT NULL)是为了避免不必要的排序)。- 后续的用户和分支名称生成逻辑和方法一一致,最终批量插入数据。
额外调整建议:
如果需要用户名称包含分支前缀(比如branch001_user001),只需要把users字段的生成逻辑改成:
'branch' + RIGHT('000' + CAST(b.BranchNum AS VARCHAR(3)), 3) + '_user' + RIGHT('000' + CAST(u.UserSeq AS VARCHAR(3)), 3)
内容的提问来源于stack exchange,提问作者Mar1009
相关产品推荐
相关产品推荐

