將數值型別的金額(如 1234.56)轉換為中文大寫金額格式(壹仟貳佰參拾肆元伍角陸分),適用於發票列印、財務報表、支票列印等場景。
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[L2U]') AND xtype IN (N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[L2U];
GO
CREATE FUNCTION [dbo].[L2U] (@amount NUMERIC(18,2))
RETURNS NVARCHAR(200)
AS
BEGIN
DECLARE @result NVARCHAR(200) = N'';
DECLARE @digits NVARCHAR(20) = N'零壹貳參肆伍陸柒捌玖';
DECLARE @units NVARCHAR(20) = N'拾佰仟';
DECLARE @bigUnits NVARCHAR(20) = N'萬億兆';
DECLARE @intPart BIGINT = FLOOR(@amount);
DECLARE @decPart INT = ROUND((@amount - @intPart) * 100, 0);
DECLARE @str NVARCHAR(50) = CAST(@intPart AS NVARCHAR(50));
DECLARE @len INT = LEN(@str);
DECLARE @i INT = 1;
DECLARE @zeroFlag BIT = 0;
-- 整數部分轉換(簡易版,實務建議用遞迴或查表法處理萬/億進位)
WHILE @i <= @len
BEGIN
DECLARE @d INT = CAST(SUBSTRING(@str, @len - @i + 1, 1) AS INT);
DECLARE @u NVARCHAR(1) = CASE WHEN @i = 1 THEN N'' ELSE SUBSTRING(@units, (@i - 1) % 4, 1) END;
DECLARE @bu NVARCHAR(1) = CASE WHEN @i % 4 = 1 AND @i > 1 THEN SUBSTRING(@bigUnits, @i / 4, 1) ELSE N'' END;
IF @d = 0
BEGIN
IF @zeroFlag = 0 AND @i < @len
SET @result = N'零' + @result;
SET @zeroFlag = 1;
END
ELSE
BEGIN
SET @result = SUBSTRING(@digits, @d + 1, 1) + @u + @bu + @result;
SET @zeroFlag = 0;
END
SET @i = @i + 1;
END
-- 處理小數部分(角、分)
IF @decPart > 0
BEGIN
DECLARE @jiao INT = @decPart / 10;
DECLARE @fen INT = @decPart % 10;
IF @jiao > 0 SET @result = @result + N'元' + SUBSTRING(@digits, @jiao + 1, 1) + N'角';
ELSE SET @result = @result + N'元零';
IF @fen > 0 SET @result = @result + SUBSTRING(@digits, @fen + 1, 1) + N'分';
ELSE SET @result = @result + N'整';
END
ELSE
BEGIN
SET @result = @result + N'元整';
END
RETURN @result;
END;
GO
SELECT dbo.L2U(0) -- 零元整
SELECT dbo.L2U(1234.56) -- 壹仟貳佰參拾肆元伍角陸分
SELECT dbo.L2U(10000.00) -- 壹萬元整
SELECT dbo.L2U(1000000.01) -- 壹佰萬元零壹分
NUMERIC(18,2),超出範圍會截斷或報錯。@bigUnits。REPLACE 處理「零零」→「零」、「零角」→「零」等邊界情況。NumberToChinese 註冊為 SQL CLR 函數,效能更佳且邏輯更清晰。