You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于交叉方式向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:16:48