SQL Server实现字符串缩写功能输出异常问题咨询
SQL Server 2008 R2 自定义缩写函数修复方案
问题根因
原有代码逻辑错误地直接截取了整个输入字符串的前5个字符,而非规则要求的「第一个单词的前5个字符」,导致第一个单词之后的空格和相邻字符被误计入前缀部分,后续遍历又重复提取对应单词首字母,最终输出不符合预期。
修改后完整函数代码
ALTER FUNCTION [dbo].[fnFirsties5] ( @str NVARCHAR(4000) ) RETURNS NVARCHAR(2000) AS BEGIN DECLARE @retval NVARCHAR(2000) DECLARE @firstSpacePos INT -- 预处理首尾空格 SET @str = RTRIM(LTRIM(@str)) IF @str IS NULL OR LEN(@str) = 0 RETURN '' -- 定位第一个空格位置,拆分第一个单词 SET @firstSpacePos = CHARINDEX(' ', @str, 1) IF @firstSpacePos = 0 -- 只有一个单词的情况,直接取前5个字符 SET @retval = LEFT(@str, 5) ELSE BEGIN -- 取第一个单词的前5个字符作为前缀 SET @retval = LEFT(LEFT(@str, @firstSpacePos - 1), 5) -- 截断字符串,保留第一个空格之后的所有内容 SET @str = LTRIM(RIGHT(@str, LEN(@str) - @firstSpacePos)) -- 遍历剩余所有单词,逐个取首字母拼接 WHILE CHARINDEX(' ', @str, 1) > 0 BEGIN SET @retval += LEFT(@str, 1) SET @str = LTRIM(RIGHT(@str, LEN(@str) - CHARINDEX(' ', @str, 1))) END -- 拼接最后一个单词的首字母 SET @retval += LEFT(@str, 1) END RETURN @retval END
验证效果
用给出的测试用例验证:
- 输入
Key Account Sales→ 输出KeyAS - 输入
HR General→ 输出HRG - 输入
Production Operator→ 输出ProduO
完全匹配预期输出要求,兼容SQL Server 2008 R2版本的语法特性。
内容的提问来源于stack exchange,提问作者Vicky
相关产品推荐
相关产品推荐

