SQL Server 2008 ProperCase函数修改报错:需将Rto转为全大写
问题分析与修正
语法错误原因
你的代码在WHILE循环中直接追加IF语句,但未用BEGIN...END包裹循环体。SQL Server要求当循环体包含多条语句时,必须用BEGIN和END明确界定范围,否则会触发语法识别错误。
逻辑优化建议
你当前的逻辑是在循环每次迭代时检查结果的前3个字符,这不符合“将字符串中所有出现的'Rto'转为全大写”的需求。更合理的做法是先完成首字母大写的格式转换,再统一替换所有'Rto'为'RTO'。
修正后的完整函数
GO /****** Object: UserDefinedFunction [dbo].[ProperCase] Script Date: 2022-11-30 9:38:28 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER function [dbo].[ProperCase](@Text as varchar(8000)) returns varchar(8000) as begin declare @Reset bit; declare @Ret varchar(8000); declare @i int; declare @c char(1); if @Text is null return null; select @Reset = 1, @i = 1, @Ret = ''; -- 用BEGIN...END包裹循环体,解决语法错误 while (@i <= len(@Text)) begin select @c = substring(@Text, @i, 1), @Ret = @Ret + case when @Reset = 1 then UPPER(@c) else LOWER(@c) end, @Reset = case when @c like '[a-zA-Z]' then 0 else 1 end, @i = @i + 1 end -- 在完成首字母大写转换后,统一替换所有'Rto'为'RTO' set @Ret = REPLACE(@Ret, 'Rto', 'RTO'); return @Ret end
说明
- 语法修复:给
WHILE循环添加BEGIN...END,确保循环内的多条语句被正确识别执行。 - 逻辑修正:将
Rto替换操作移到循环结束后,既覆盖了你提到的“原RTO转为Rto后再改成RTO”的场景,也能处理字符串中包含Rto子串的其他情况(例如"abc Rto xyz"会被转为"Abc RTO Xyz")。
内容的提问来源于stack exchange,提问作者Curious
相关产品推荐
相关产品推荐

