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'
优化点说明
- 变量长度调整:将
@firstName设为NVARCHAR(30),直接匹配最大长度限制;@lastName设为NVARCHAR(220),确保能容纳原姓名剩余内容 - 判断逻辑修正:原代码未计算添加单词时需要的空格长度,修正后判断
LEN(@firstName) + LEN(@value) + 1 <= 30,保证加上单词和空格后不超过30字符 - 简化代码:去掉不必要的
ISNULL(初始值为空字符串,无需判断)和调试用的PRINT语句,精简逻辑
内容的提问来源于stack exchange,提问作者Peter Break
相关产品推荐
相关产品推荐

