如何在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即可拿到所有拆分后的数字,结果如下:
| 位置序号 | 对应数字 |
|---|---|
| 1 | 0 |
| 2 | 0 |
| 3 | 8 |
| 4 | 3 |
| 5 | 4 |
| 6 | 4 |
| 7 | 1 |
| 8 | 1 |
| 9 | 4 |
| 10 | 1 |
注意事项
- 如果输入字符串可能混入非数字字符,可在
CAST转换前加ISNUMERIC(SUBSTRING(@natioanlCode, Pos, 1)) = 1的判断,避免转换报错 - 固定长度场景优先选择第一种逐位赋值的写法,性能远高于递归、循环类方案
- 第二种方案中的MAXRECURSION参数最大可设置为32767,支持最长3万多位的字符串拆分
内容的提问来源于stack exchange,提问作者Muhamad Khojastefard
相关产品推荐
相关产品推荐

