replicate 是 sql server 特有函数,用于将字符串按指定次数重复拼接,如 replicate('0', 5) 返回 '00000';首参须为字符串类型,次参为非负整数,负数或零返回空字符串;常与 right、cast 等配合实现左补零,推荐 right(replicate('0',n)+cast(val as varchar),n) 模式以规避长度计算风险。

REPLICATE 函数在 SQL Server 中怎么用?
REPLICATE 是 SQL Server 特有的字符串重复函数,MySQL、PostgreSQL、Oracle 都不支持。如果你在非 SQL Server 环境下执行 REPLICATE('0', 5),会直接报错 Invalid function name 'REPLICATE' —— 先确认你用的是 SQL Server(含 Azure SQL)或兼容版本。
它的作用很简单:把一个字符串按指定次数重复拼接。比如 REPLICATE('A', 3) 返回 'AAA',REPLICATE('0', 6) 返回 '000000'。
- 第一个参数必须是字符串类型(
char、varchar、nchar、nvarchar),不能是数字或 NULL(NULL 会导致整个结果为 NULL) - 第二个参数是整数,表示重复次数;若为负数,SQL Server 返回空字符串(
''),不是错误 - 若重复次数为 0,结果也是空字符串,不是 NULL
生成固定长度的流水号前缀(比如 00001 → 000000001)
常见需求是把一个数字转成固定位数的字符串,左侧补零。这时候不能只靠 REPLICATE,它只负责“补多少个”,还得配合 LEN 和 CONVERT/CAST 计算缺多少位。
例如,要把 ID=7 补成 9 位编号:
SELECT REPLICATE('0', 9 - LEN(CONVERT(VARCHAR, 7))) + CONVERT(VARCHAR, 7)
结果是 '000000007'。注意这里隐含风险:
- 如果原始值位数超过目标长度(比如 ID=1234567890,要补成 9 位),
9 - LEN(...)会是负数,REPLICATE返回空串,最终结果就是原数字本身,不报错也不截断 —— 容易漏检 -
LEN()对带空格的字符串会忽略尾部空格,但对数字转字符串影响不大;真正要注意的是 Unicode 字符(nvarchar)下LEN行为一致,可放心用 - 更健壮写法是加
CASE WHEN LEN(...) >= 9 THEN ... ELSE ... END做兜底
和 RIGHT/STR 配合使用更简洁?
比起手动算长度+拼接,SQL Server 提供了更直接的方式:RIGHT + REPLICATE 组合,或者用 STR(但 STR 有空格填充问题)。
推荐写法:
SELECT RIGHT(REPLICATE('0', 9) + CAST(@id AS VARCHAR(20)), 9)
原理是先造一个足够长的零串(比如 9 个 0),再拼上数字,最后取右 9 位。这样避免了长度计算逻辑,也天然规避了超长数字导致负数的问题。
- 只要
REPLICATE('0', N)的N不小于目标位数,这个模式就安全 - 如果
@id是NULL,整个表达式结果也是NULL,需额外用ISNULL(@id, 0)处理 - 性能上,
REPLICATE+RIGHT比多次LEN判断略快,尤其在批量生成时
替代方案:为什么不用 FORMAT 或 CONCAT?
SQL Server 2012+ 支持 FORMAT(@id, 'D9'),看起来更干净:
SELECT FORMAT(7, 'D9') -- 返回 '000000007'
但它有明显缺点:
- 性能差:
FORMAT是 CLR 函数,比纯字符串操作慢 3–5 倍,大数据量生成序列号时不推荐 - 依赖语言设置:如果服务器语言设为德语,
FORMAT(123, 'N0')会输出带点分隔符的格式,D9虽然稳定,但仍有隐式转换开销 - 兼容性差:Azure SQL 可用,但某些旧版 SQL Server Express 可能禁用 CLR,导致
FORMAT不可用
所以生产环境批量生成填充码,REPLICATE + RIGHT 仍是更可控的选择。
真正容易被忽略的是字符集和排序规则——如果字段是 nvarchar,建议统一用 N'0' 调用 REPLICATE(N'0', 9),避免隐式转换引发的排序规则冲突或截断。











