SQL高效更新:移除DocArrangement_History表TicketNumber第14位的/
最优方案:用STUFF函数是你的最佳选择
嘿,这个需求我太熟了!咱们直接说结论:STUFF函数就是处理这种精准位置字符删除的最优方案,甚至可以说它就是为这类场景量身打造的,比其他替代方案更高效、更直观。
为什么STUFF是最优解?
STUFF是SQL原生的字符串操作函数,专门用于在指定位置插入、删除或替换字符,它的性能非常出色——不需要扫描整个字符串匹配所有目标字符(比如REPLACE会做的事),直接定位到第14位进行删除操作,精准且高效。
单条记录更新示例
如果只是要处理你示例里的那条特定记录,直接用下面的SQL就行:
UPDATE DocArrangement_History SET TicketNumber = STUFF(TicketNumber, 14, 1, '') WHERE TicketNumber = '1317023835606/606-607'; -- 或者用主键/其他唯一标识定位更稳妥
这里STUFF的参数逻辑很清晰:
- 第一个参数:要修改的原字符串(TicketNumber)
- 第二个参数:起始操作位置(第14位)
- 第三个参数:要删除的字符长度(1个,就是那个‘/’)
- 第四个参数:替换为空字符串,相当于删除该位置的字符
批量更新场景(如果有多个符合条件的记录)
如果需要批量处理所有第14位是‘/’的记录,记得加WHERE条件过滤,避免无意义的更新操作,进一步提升效率:
UPDATE DocArrangement_History SET TicketNumber = STUFF(TicketNumber, 14, 1, '') WHERE SUBSTRING(TicketNumber, 14, 1) = '/';
对比其他替代方案(为什么不选它们?)
- REPLACE函数:虽然简单,但它会替换字符串中所有的‘/’,如果你的TicketNumber里还有其他位置的‘/’,就会误改,安全性和精准性远不如STUFF。
- LEFT+RIGHT拼接:比如
LEFT(TicketNumber,13) + RIGHT(TicketNumber, LEN(TicketNumber)-14),虽然能实现效果,但代码可读性差,还需要计算字符串长度,性能上和STUFF差不多,但直观性差很多,没必要舍近求远。
总结
只要你的需求是精准删除第14位的单个字符,STUFF就是最高效、最稳妥的实现方式,语法简洁,性能拉满,完全不用纠结其他方案~
内容的提问来源于stack exchange,提问作者Kamran Malik
相关产品推荐
相关产品推荐

