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

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

说明

  1. 语法修复:给WHILE循环添加BEGIN...END,确保循环内的多条语句被正确识别执行。
  2. 逻辑修正:将Rto替换操作移到循环结束后,既覆盖了你提到的“原RTO转为Rto后再改成RTO”的场景,也能处理字符串中包含Rto子串的其他情况(例如"abc Rto xyz"会被转为"Abc RTO Xyz")。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:20:32