完整的 SQL Server 2016 自定义函数实现,将整数转换为英文单词形式

CREATE FUNCTION dbo.ConvertHundreds (@Number INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @Result NVARCHAR(MAX) = ''
IF @Number = 0 RETURN ''
DECLARE @Hundreds INT = @Number / 100
DECLARE @Remaining INT = @Number % 100
-- 处理百位
IF @Hundreds > 0
SET @Result = CASE @Hundreds
WHEN 1 THEN 'One Hundred '
WHEN 2 THEN 'Two Hundred '
WHEN 3 THEN 'Three Hundred '
WHEN 4 THEN 'Four Hundred '
WHEN 5 THEN 'Five Hundred '
WHEN 6 THEN 'Six Hundred '
WHEN 7 THEN 'Seven Hundred '
WHEN 8 THEN 'Eight Hundred '
WHEN 9 THEN 'Nine Hundred '
ELSE ''
END
-- 处理十位和个位
IF @Remaining > 0
BEGIN
IF @Remaining BETWEEN 10 AND 19
BEGIN
SET @Result += CASE @Remaining
WHEN 10 THEN 'Ten' WHEN 11 THEN 'Eleven' WHEN 12 THEN 'Twelve'
WHEN 13 THEN 'Thirteen' WHEN 14 THEN 'Fourteen' WHEN 15 THEN 'Fifteen'
WHEN 16 THEN 'Sixteen' WHEN 17 THEN 'Seventeen' WHEN 18 THEN 'Eighteen'
WHEN 19 THEN 'Nineteen' ELSE '' END
END
ELSE
BEGIN
DECLARE @Tens INT = @Remaining / 10
DECLARE @Ones INT = @Remaining % 10
IF @Tens > 0
SET @Result += CASE @Tens
WHEN 2 THEN 'Twenty' WHEN 3 THEN 'Thirty' WHEN 4 THEN 'Forty'
WHEN 5 THEN 'Fifty' WHEN 6 THEN 'Sixty' WHEN 7 THEN 'Seventy'
WHEN 8 THEN 'Eighty' WHEN 9 THEN 'Ninety' ELSE '' END + ' '
IF @Ones > 0
SET @Result += CASE @Ones
WHEN 1 THEN 'One' WHEN 2 THEN 'Two' WHEN 3 THEN 'Three'
WHEN 4 THEN 'Four' WHEN 5 THEN 'Five' WHEN 6 THEN 'Six'
WHEN 7 THEN 'Seven' WHEN 8 THEN 'Eight' WHEN 9 THEN 'Nine' ELSE '' END
END
END
RETURN RTRIM(@Result)
END
GO
CREATE FUNCTION dbo.NumberToEnglish (@Number INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
IF @Number = 0 RETURN 'Zero'
DECLARE @Result NVARCHAR(MAX) = ''
-- 分解数字到不同量级
DECLARE @Billions INT = @Number / 1000000000
SET @Number %= 1000000000
DECLARE @Millions INT = @Number / 1000000
SET @Number %= 1000000
DECLARE @Thousands INT = @Number / 1000
SET @Number %= 1000
DECLARE @Hundreds INT = @Number
-- 转换各个量级
IF @Billions > 0
SET @Result += dbo.ConvertHundreds(@Billions) + ' Billion '
IF @Millions > 0
SET @Result += dbo.ConvertHundreds(@Millions) + ' Million '
IF @Thousands > 0
SET @Result += dbo.ConvertHundreds(@Thousands) + ' Thousand '
IF @Hundreds > 0
SET @Result += dbo.ConvertHundreds(@Hundreds)
RETURN RTRIM(REPLACE(REPLACE(@Result, ' ', ' '), ' ', ' '))
END
GO
使用示例:
SELECT dbo.NumberToEnglish(0) -- Zero
SELECT dbo.NumberToEnglish(123) -- One Hundred Twenty Three
SELECT dbo.NumberToEnglish(105000) -- One Hundred Five Thousand
SELECT dbo.NumberToEnglish(2147483647) -- Two Billion One Hundred Forty Seven Million Four Hundred Eighty Three Thousand Six Hundred Forty Seven
函数说明:
ConvertHundreds
函数:- 处理 0-999 的数字转换
- 分解为百位、十位和个位进行转换
- 处理特殊的 10-19 数字以及常规的十位+个位组合
NumberToEnglish
主函数:- 处理全量数字分解(十亿/百万/千/百)
- 调用 ConvertHundreds 处理每个量级
- 合并结果并清理多余空格
注意事项:
- 支持的最大数值为 2,147,483,647(INT 最大值)
- 负数需要额外处理(本示例未实现)
- 输出结果单词间用单个空格分隔,无连字符
- 多个量级间自动添加对应量级单位(Billion/Million/Thousand)
可以通过直接调用 dbo.NumberToEnglish()
函数将整数转换为对应的英文单词形式。