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

如何在MS SQL中提取nvarchar变量所有数字并拆分赋值给独立变量

T-SQL 逐位拆分nvarchar数字实现方案

你可以根据实际场景选择以下两种实现方式,均兼容示例中的T-SQL语法:

方式一:赋值给预先声明的固定序号int变量

适合字符串长度固定的场景(比如示例中长度为10的编码),直接用SUBSTRING按位置截取字符转int即可,无额外开销,执行效率最高。

-- 原始输入声明
declare @natioanlCode nvarchar(10) = '0083441141';

-- 声明逐位存储的int变量
declare @n1 int, @n2 int, @n3 int, @n4 int, @n5 int;
declare @n6 int, @n7 int, @n8 int, @n9 int, @n10 int;

-- 逐位截取转换赋值
SELECT 
    @n1 = CAST(SUBSTRING(@natioanlCode, 1, 1) AS int),
    @n2 = CAST(SUBSTRING(@natioanlCode, 2, 1) AS int),
    @n3 = CAST(SUBSTRING(@natioanlCode, 3, 1) AS int),
    @n4 = CAST(SUBSTRING(@natioanlCode, 4, 1) AS int),
    @n5 = CAST(SUBSTRING(@natioanlCode, 5, 1) AS int),
    @n6 = CAST(SUBSTRING(@natioanlCode, 6, 1) AS int),
    @n7 = CAST(SUBSTRING(@natioanlCode, 7, 1) AS int),
    @n8 = CAST(SUBSTRING(@natioanlCode, 8, 1) AS int),
    @n9 = CAST(SUBSTRING(@natioanlCode, 9, 1) AS int),
    @n10 = CAST(SUBSTRING(@natioanlCode, 10, 1) AS int);

执行完成后各变量值和预期完全一致:@n1=0、@n2=0、@n3=8……@n10=1。

方式二:拆分结果存入数据表

适合字符串长度不固定、不想提前声明固定数量变量的场景,通过递归CTE生成位置序列,逐位拆分后存入表结构,可灵活查询使用。

-- 原始输入声明,长度可根据业务调整
declare @natioanlCode nvarchar(100) = '0083441141';

-- 生成和字符串长度匹配的位置序列
;WITH NumSeq AS (
    SELECT 1 AS Pos
    UNION ALL
    SELECT Pos + 1 FROM NumSeq WHERE Pos < LEN(@natioanlCode)
)
-- 拆分结果存入临时表
SELECT 
    Pos AS DigitPosition,
    CAST(SUBSTRING(@natioanlCode, Pos, 1) AS int) AS DigitValue
INTO #SplitDigitResult
FROM NumSeq
OPTION (MAXRECURSION 100); -- 递归上限和支持的最大字符串长度保持一致即可

查询临时表#SplitDigitResult即可拿到所有拆分后的数字,结果如下:

位置序号对应数字
10
20
38
43
54
64
71
81
94
101

注意事项

  • 如果输入字符串可能混入非数字字符,可在CAST转换前加ISNUMERIC(SUBSTRING(@natioanlCode, Pos, 1)) = 1的判断,避免转换报错
  • 固定长度场景优先选择第一种逐位赋值的写法,性能远高于递归、循环类方案
  • 第二种方案中的MAXRECURSION参数最大可设置为32767,支持最长3万多位的字符串拆分

内容的提问来源于stack exchange,提问作者Muhamad Khojastefard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:42:17