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

SQL优化请求:按30字符限制拆分姓名并优化游标实现代码

姓名拆分优化:限制FirstName最大长度为30字符

需求说明

需从完整姓名字符串中拆分出FirstName和LastName,要求:

  • FirstName长度最大为30字符
  • 不能截断单词,当FirstName添加下一个单词会超过30字符时,剩余所有单词归入LastName

初始尝试及问题

初始代码试图通过反转字符串找最后一个空格拆分,但无法满足长度限制需求:

declare @name nvarchar(250)='David Judith and Holofernes Equestrian of Gattamelata'

SELECT LEFT(rtrim(@name), LEN(rtrim(@name)) - CHARINDEX(' ',REVERSE(rtrim(@name)))) 'firstName'

SELECT RIGHT(rtrim(@name), CHARINDEX(' ',REVERSE(rtrim(@name)))-1) 'lastName'

初始结果

  • FirstName = David Judith and Holofernes Equestrian of
  • LastName = Gattamelata

期望结果

  • FirstName = David Judith and Holofernes(长度为29,未超过30)
  • LastName = Equestrian of Gattamelata

优化后的代码

原游标代码的判断逻辑未考虑添加单词时的空格长度,导致可能出现FirstName超过30的情况,以下是修正后的版本:

declare @name nvarchar(250)='David Judith and Holofernes Equestrian of Gattamelata'

DECLARE @firstName as NVARCHAR(30)=''; -- 贴合最大长度需求,设为30
DECLARE @lastName  as NVARCHAR(220)=''; -- 250-30=220,足够容纳剩余内容
DECLARE @value     as NVARCHAR(50);
DECLARE @NamesCursor as CURSOR;

SET @NamesCursor = CURSOR FORWARD_ONLY FOR
SELECT value FROM STRING_SPLIT(@name, ' ');

OPEN @NamesCursor;
FETCH NEXT FROM @NamesCursor INTO @value;

WHILE @@FETCH_STATUS = 0
BEGIN
    -- 判断:当前FirstName长度 + 单词长度 + 空格长度(1)不超过30
    IF (LEN(@firstName) + LEN(@value) + 1 <= 30)
        SET @firstname = @firstname + @value + ' '
    ELSE 
        SET @lastName = @lastName + @value + ' '
    
    FETCH NEXT FROM @NamesCursor INTO @value;
END

CLOSE @NamesCursor;
DEALLOCATE @NamesCursor;

SELECT RTRIM(@firstname) 'First Name', RTRIM(@lastName) 'Last Name'

优化点说明

  1. 变量长度调整:将@firstName设为NVARCHAR(30),直接匹配最大长度限制;@lastName设为NVARCHAR(220),确保能容纳原姓名剩余内容
  2. 判断逻辑修正:原代码未计算添加单词时需要的空格长度,修正后判断LEN(@firstName) + LEN(@value) + 1 <= 30,保证加上单词和空格后不超过30字符
  3. 简化代码:去掉不必要的ISNULL(初始值为空字符串,无需判断)和调试用的PRINT语句,精简逻辑

内容的提问来源于stack exchange,提问作者Peter Break

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:50:20