SQL Server标量函数将数字转换为带有序数的单词

Posted

技术标签:

【中文标题】SQL Server标量函数将数字转换为带有序数的单词【英文标题】:SQL Server scalar function to convert number to words with ordinal 【发布时间】:2017-04-26 04:35:35 【问题描述】:

如何在 SQL Server 中构建一个标量函数,将数字转换为带有序数的单词。 例子 : 输入 25 的输出应为“二十五分之一”

谢谢。

【问题讨论】:

明智地编程这是个好问题,但您不会在数据库中处理此类事情。 数据库绝对是做这件事的错误地方,但对于傻笑,我们可能有几种方法可以解决这个问题。你想去什么范围? 0 到 999 之间的任何数字? how to write number to word function in sql server的可能重复 【参考方案1】:

范围 0 到 9999

 declare @t table(col1 int,col2 varchar(50),col3 int)
insert into @t (col1,col2) VALUES (0,'Zero'),(1,'One'),(2,'Two')
,(3,'Three'),(4,'Four'),(5,'Five'),(6,'Six'),(7,'Seven'),(8,'Eight')
,(9,'Nine'),(10,'Ten'),(11,'eleven'),(12,'Twelve'),(13,'thirteen')
,(14,'Fourteen'),(15,'Fifteen'),(16,'Sixteen'),(17,'Seventeen')
,(18,'Eighteen'),(19,'Nineteen'),(20,'Twenty'),(30,'Thirty'),(40,'Forty')
,(50,'Fifty'),(60,'Sixty'),(70,'Seventy'),(80,'Eighty'),(90,'Ninety')
,(100,'Hundreds'),(1000,'Thousands'),(10000,'Thousands')

    declare @input varchar(10)='1897'

    declare @Words varchar(2000)=''
    declare @i int=len(@input)

    while((len(@input)>0))
    begin

    if(@input>=0 and @input<=19 and @i=len(@input))
    begin
    select @Words=@Words+' '+ col2 from @t where col1 =@input
    BREAK
    END
    else if(len(@input) between 3 and 4)
    BEGIN
    select @Words=@Words+' '+ col2 from @t where col1 =@input/cast(('1'+replicate('0',len(@input)-1)) as int)
    select @Words=@Words+' '+ col2 from @t where col1 ='1'+replicate('0',len(@input)-1)
    END
    else
    begin
    select @Words=@Words+' '+ col2 from @t where col1 =left(@input,1)+ replicate('0',@i-1)

    END
    set @input=stuff(@input,1,1,'')
    if(cast(@input as int)=0)
    BREAK
    set @i=@i-1


    end
    select @Words

【讨论】:

以上是关于SQL Server标量函数将数字转换为带有序数的单词的主要内容,如果未能解决你的问题,请参考以下文章

sql server中是不是有可以将数字转换为单词的内置函数

sql server2000如何将数字转换为日期时间

sql server 标量函数的用法

将序数格式转换为数字

如何在 MS Access VB 中访问 SQL Server 标量函数

标量函数在存储过程中使用时在 SQL Server 中发生请求超时问题