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

完整的 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

函数说明:

  1. ConvertHundreds 函数:
    • 处理 0-999 的数字转换
    • 分解为百位、十位和个位进行转换
    • 处理特殊的 10-19 数字以及常规的十位+个位组合
  2. NumberToEnglish 主函数:
    • 处理全量数字分解(十亿/百万/千/百)
    • 调用 ConvertHundreds 处理每个量级
    • 合并结果并清理多余空格

注意事项:

  • 支持的最大数值为 2,147,483,647(INT 最大值)
  • 负数需要额外处理(本示例未实现)
  • 输出结果单词间用单个空格分隔,无连字符
  • 多个量级间自动添加对应量级单位(Billion/Million/Thousand)

可以通过直接调用 dbo.NumberToEnglish() 函数将整数转换为对应的英文单词形式。