stuff函数仅执行“删除指定长度子串后插入新字符串”这一操作,参数start从1起算,length为0时实现插入,超出长度则自动截断,null输入导致结果为null。

STUFF函数到底能做什么,不能做什么
STUFF 不是“插入字符串”或“删除子串”的通用工具,它只做一件事:**从原字符串指定位置开始,删掉指定长度的字符,再把新字符串插进去**。它没有单独的“插入模式”或“删除模式”,所有效果都由三个参数共同决定——删多少、从哪删、替换成什么。
常见误解是以为 STUFF('abc', 2, 0, 'X') 是“在位置2插入X”,其实它本质是“从位置2删0个字符,再塞入X”。SQL Server里这能工作,但逻辑上仍是“替换零长度片段”,不是真正意义上的插入操作。
怎么用STUFF实现常见场景(附参数陷阱)
关键看三个参数:STUFF(string, start, length, replacement)。其中 start 从1开始计数(不是0),length 为0时只插入不删,length 超出剩余长度时自动截断到末尾。
- 在字符串中间插入内容:
STUFF('hello', 3, 0, 'XX')→'heXXllo'(从第3位前插入) - 覆盖式修改(如改第4–5位):
STUFF('abcdef', 4, 2, 'YZ')→'abYZef' - 删除指定区间:
STUFF('abcdef', 2, 3, '')→'aef'(删第2位起3个字符,即'bcd') - 错误写法(start为0或负数):
STUFF('abc', 0, 1, 'x')返回NULL,必须保证start >= 1 - 边界越界安全:
STUFF('ab', 5, 1, 'x')不报错,直接返回原字符串'ab'(因为起始位置已超长)
和REPLACE、SUBSTRING比,什么时候该选STUFF
当你要精确控制“从第N位开始、动M个字符、换成P内容”时,STUFF 比拼接 SUBSTRING 更简洁;但它无法按内容定位(比如“删掉第一个逗号之后的所有内容”),这种得用 CHARINDEX 配合 SUBSTRING 或 LEFT。
性能上无明显差异,但可读性取决于场景:
- 需要位置偏移操作 → 优先
STUFF - 需要按字符/子串内容找位置 → 必须先用
CHARINDEX算出start和length,再喂给STUFF - 单纯全局替换关键词 →
REPLACE更直白,别硬套STUFF
容易被忽略的细节:空值、Unicode和排序规则
STUFF 对 NULL 输入非常敏感——任一参数为 NULL,整个结果就是 NULL。尤其 replacement 是变量时,记得用 ISNULL(@var, '') 防崩。
如果处理中文或emoji,确保字段和字面量都是 NVARCHAR 类型,否则可能截断或乱码:STUFF(N'你好', 2, 1, N'啊') ✅,而 STUFF('你好', 2, 1, '啊') ❌(隐式转换可能丢数据)。
排序规则不影响 STUFF 行为,但会影响你用 CHARINDEX 定位时是否区分大小写——这点常被当成 STUFF 自身问题。










