基于交叉方式向SQL Server表插入数据的优化方案咨询
更简洁的SQL Server插入方案:无需临时表/复杂循环
嘿,你之前的方法确实有点绕,其实用递归CTE或者系统辅助表就能轻松生成你要的A-Z和101-1203的交叉数据,直接插入目标表就行,不用折腾临时表。给你两个实用方案:
方案1:递归CTE生成序列并交叉连接
递归CTE可以分别生成字母序列和数字序列,然后直接交叉连接插入,代码清晰易懂:
-- 生成A-Z的字母序列 + 101-1203的数字序列,交叉插入目标表 WITH Letters AS ( -- 起始字母A SELECT 1 AS N, CHAR(65) AS Alphabet UNION ALL -- 递归生成后续字母,直到Z(N=26) SELECT N + 1, CHAR(65 + N) FROM Letters WHERE N < 26 ), Numbers AS ( -- 起始数字101 SELECT 101 AS Number UNION ALL -- 递归生成后续数字,直到1203 SELECT Number + 1 FROM Numbers WHERE Number < 1203 ) -- 交叉连接两个序列,插入到你的目标表 INSERT INTO YourTargetTable (Alphabet, Number) SELECT l.Alphabet, n.Number FROM Letters l CROSS JOIN Numbers n -- 因为数字序列超过默认递归深度(100),需要关闭递归限制 OPTION (MAXRECURSION 0);
解释下关键部分:
CHAR(65 + N):ASCII码里A是65,N从1到26时,就能生成A-Z的完整字母序列OPTION (MAXRECURSION 0):数字序列需要生成1103行(1203-101+1),超过了SQL Server默认的递归深度限制,所以需要手动关闭
方案2:用系统表spt_values生成序列(更高效)
SQL Server自带的master..spt_values表有现成的整数序列,用它来生成数据会更快,适合数据量稍大的场景:
INSERT INTO YourTargetTable (Alphabet, Number) -- 生成A-Z的字母 SELECT CHAR(64 + num1) AS Alphabet, -- 生成101-1203的数字 100 + num2 AS Number FROM -- 生成1-26的数字,对应A-Z (SELECT number AS num1 FROM master..spt_values WHERE type = 'P' AND number BETWEEN 1 AND 26) AS Letters CROSS JOIN -- 生成1-1103的数字,加100后刚好是101-1203 (SELECT number AS num2 FROM master..spt_values WHERE type = 'P' AND number BETWEEN 1 AND 1103) AS Numbers;
解释:
master..spt_values的type='P'对应整数序列,范围是0到2047,完全覆盖你需要的数字范围- 不需要递归,直接筛选出需要的数字段,性能比递归CTE更优
记得把YourTargetTable换成你实际要插入的表名哦,这两个方案都能一步到位完成需求,比临时表交叉查询简洁太多啦!
内容的提问来源于stack exchange,提问作者user7756155
相关产品推荐
相关产品推荐

