SQL Server 缺乏內建 LPAD()/RPAD() 函數,常見需求:流水號、編號固定長度左補零(如 1 → '00001'、333 → '00333')。
RIGHT('00000' + CAST(@num AS VARCHAR), 5)DECLARE @SN INT, @SNLen INT = 5;
SET @SN = 1;
SELECT RIGHT(REPLICATE('0', @SNLen) + CAST(@SN AS VARCHAR(10)), @SNLen); -- '00001'
SET @SN = 333;
SELECT RIGHT(REPLICATE('0', @SNLen) + CAST(@SN AS VARCHAR(10)), @SNLen); -- '00333'
SET @SN = 55555;
SELECT RIGHT(REPLICATE('0', @SNLen) + CAST(@SN AS VARCHAR(10)), @SNLen); -- '55555'
REPLICATE('0', @SNLen):動態產生指定長度零字串,比寫死 '00000' 更彈性。CAST(@SN AS VARCHAR(10)):數字轉字串,長度足夠容納最大值。RIGHT(..., @SNLen):取右側固定長度,自動截斷多餘前導零(當數字位數超過目標長度時保留完整數字)。CREATE FUNCTION dbo.fn_LeftPadZero
(
@Value BIGINT,
@TotalLength TINYINT
)
RETURNS VARCHAR(50)
WITH SCHEMABINDING
AS
BEGIN
DECLARE @Str VARCHAR(50) = CAST(@Value AS VARCHAR(50));
IF LEN(@Str) >= @TotalLength RETURN @Str;
RETURN RIGHT(REPLICATE('0', @TotalLength) + @Str, @TotalLength);
END;
GO
-- 使用範例
SELECT dbo.fn_LeftPadZero(1, 5) AS r1; -- '00001'
SELECT dbo.fn_LeftPadZero(333, 5) AS r2; -- '00333'
SELECT dbo.fn_LeftPadZero(55555, 5) AS r3; -- '55555'
SELECT dbo.fn_LeftPadZero(123456, 5) AS r4; -- '123456' (超長保留原值)
DECLARE @DateTime DATETIME = GETDATE();
DECLARE @Year CHAR(4) = DATENAME(YEAR, @DateTime); -- '2024'
DECLARE @Month CHAR(2) = RIGHT('0' + DATENAME(MONTH, @DateTime), 2); -- '01'~'12'
DECLARE @Seq INT = 1; -- 實際從序號表/SEQUENCE 取得
DECLARE @Serial VARCHAR(20) = @Year + @Month + dbo.fn_LeftPadZero(@Seq, 5);
-- 結果例:'20240100001'
SELECT @Serial;
| 資料庫 | 函數 | 範例 |
|---|---|---|
| MySQL | LPAD(str, len, padstr) | LPAD(1, 5, '0') → '00001' |
| PostgreSQL | LPAD(str, len, padstr) | 同 MySQL |
| Oracle | LPAD(expr, n, pad) | 同標準 |
| SQL Server | 無內建,用 RIGHT(REPLICATE+CAST) | 本文方案 |
RIGHT(REPLICATE('0', length) + CAST(value AS VARCHAR), length) 是 SQL Server 左補零的標準慣用寫法,效能優異、邏輯清晰、易封裝為函數。配合 DATENAME/SEQUENCE 可快速構建帶年月的業務流水號。記得處理超長數字的業務邏輯(截斷、報錯、擴充長度)。