转自http://blog.csdn.net/tlammon/article/details/51068654

--1、人民币小写金额转大写(第一版)

--====================================================================
-- Title: 人民币小写金额转大写
-- Author: dobear        Mail(MSN): dobear_0922@hotmail.com
-- Environment: Vista + SQL2005
-- Date: 2008-06-12
-- Remark: dobear原创,转载请注明出处,有问题请发Mail告之
--- ====================================================================
 USE [HMSH]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--创建函数
alter function [dbo].[fn_getformatmoney] (@money numeric(14,2))
returns nvarchar(32) as
begin
    declare @money_num nvarchar(20)    --存储金额的字符形式
        , @money_chn nvarchar(32)    --存储金额的中文大写形式
        , @n_chn nvarchar(1), @i int    --临时变量
 
    select @money_chn=case when @money>=0 then '' else N'(负)' end
        , @money=abs(@money)
        , @money_num=stuff(str(@money, 15, 2), 13, 1, '')    --加前置空格补齐到位(去掉小数点)
        , @i=patindex('%[1-9]%', @money_num)    --找到金额最高位
 
    while @i>=1 and @i<=14
    begin
        set @n_chn=substring(@money_num, @i, 1)   
        if @n_chn<>'0' or (substring(@money_num,@i+1,1)<>'0' and @i not in(4, 8, 12, 14))    --转换阿拉伯数字为中文大写形式   
            set @money_chn=@money_chn+substring(N'零壹贰叁肆伍陆柒捌玖', @n_chn+1, 1)
        if @n_chn<>'0' or @i in(4, 8, 12)    --添加中文单位
            set @money_chn=@money_chn+substring(N'仟佰拾亿仟佰拾万仟佰拾圆角分',@i,1)     
   
        set @i=@i+1
    end
 
    set @money_chn=replace(@money_chn, N'亿万', N'亿')    --当金额为x亿零万时去掉万
    if @money=0 set @money_chn=N'零圆整'    --当金额为零时返回'零圆整'
    if @n_chn='0' set @money_chn=@money_chn+N'整'    --当金额末尾为零分时以'整'结尾
 
    return @money_chn    --返回大写金额
end
go
--测试示例
--select dbo.fn_getformatmoney(4545.44)
--运行结果
/*
肆仟伍佰肆拾伍圆肆角肆分
*/
 
--2、人民币小写金额转大写(第二版)
/*编写者:(博客天地www.inbaidu.com )
创建时间:
功能:小写金额转换成大写
参数:@LowerMoney 小写金额加上小数点最长可以保留位
输出:大写金额
简介:SQL版小写金额转换成大写金额(最多可以精确到小数点四位)
注: Decimal 数据类型最多可存储个数字
转载:请保留以上信息,谢谢!!!
********************************************************/
 USE [HMSH]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--创建函数
Alter function [dbo].[lowertoupper](@lowermoney decimal(38,4))
returns nvarchar(200)    --返回的大写金额的字符
as
begin
      declare @lowerstr nvarchar(50)    --小写金额
      declare @upperstr  nvarchar(200)  --大写金额
      declare @uppertmp  nvarchar(15)    --大写金额的临时字符串
      declare @i          int            --递增量
      declare @lowerlen  int            --小写金额的总长度
 
      set @lowerstr = @lowermoney --把decimal型的值全部赋给字符串变量注:(赋值过去的话如在字符串变量中是显示.0000 因为小数位精确到四位,没有的话,它会自动补)
      set @lowerstr = replace(@lowerstr,'.','') --把小数点替换成空字符    --精确到小数点的四位角分厘毫
 
      set @lowerlen = len(@lowerstr) --获取小写金额的总长度(包括四个小数位)
      select @i = 1,@upperstr = '',@uppertmp = '' --设置默认初始值
 
      while @i <= @lowerlen         
          begin
            set @uppertmp = case
                                  when substring(@lowerstr,@lowerlen - @i + 1,1) = '0' and @i = 5 and(convert(int,right(@lowerstr,4)) = 0 or @lowerlen > 5) then N'元'      --注:如果个位为的话,并且四位小数都是或者它的长度超过(也就是超过元),则为元
                                  --when substring(@lowerstr,@lowerlen - @i + 1,1) = '0' then ''
                                  else
                                      + case substring(@lowerstr,@lowerlen - @i + 1,1) --看当前位是数字几,就直接替换成汉字繁体大写
                                              when '0' then N'零'
                                              when '1' then N'壹'
                                              when '2' then N'贰'
                                              when '3' then N'叁'
                                              when '4' then N'肆'
                                              when '5' then N'伍'
                                              when '6' then N'陆'
                                              when '7' then N'柒'
                                              when '8' then N'捌'
                                              when '9' then N'玖'
                                        end
                                      + case @i
                                              when 1      then N'毫'
                                              when 2      then N'厘'
                                              when 3      then N'分'
                                              when 4      then N'角'
                                              when 5      then N'元'
                                              when 9      then N'萬'
                                              when 13      then N'亿'
                                              when 17      then N'兆'
                                              when 21      then N'京'
                                              when 25      then N'垓'
                                              when 29      then N'杼' 
                                              when 33      then N'穰'
                                              when 37      then N'沟' --decimal型最大长度是后面的就不用再考虑了
                                              else
                                                  + case @i%4
                                                          when 2 then N'拾'      --拾10 14 18 22 26 30 34 38 …………
                                                          when 3 then N'佰'      --佰11 15 19 23 27 31 35 39 …………
                                                          when 0 then N'仟'      --仟12 16 20 24 28 32 36 40 …………
                                                      end
                                        end
                            end
            set @upperstr = isnull(@uppertmp,'') + isnull(@upperstr,'')
            set @i = @i + 1
          end
      if convert(int,right(@lowerstr,4)) = 0 set @upperstr = left(@upperstr,len(@upperstr)-8) + N'整' --判断小数位数是不是都是,是就可以取整
      while patindex(N'%零[仟佰拾角分厘毫零]%',@upperstr) <> 0    --把零拾或零佰或零零变成一个零
          begin
            set @upperstr = stuff(@upperstr,patindex(N'%零[仟佰拾角分厘毫零]%',@upperstr),2,N'零')
          end
      while patindex(N'%[沟穰杼垓京兆亿萬]零[沟穰杼垓京兆亿萬]%',@upperstr) <> 0 --把零萬或零亿的清空掉
          begin
            select @upperstr = stuff(@upperstr,patindex(N'%[沟穰杼垓京兆亿萬]零[沟穰杼垓京兆亿萬]%',@upperstr)+1,2,'')
          end
      while patindex(N'%[仟佰拾]零[沟穰杼垓京兆亿萬]%',@upperstr) <> 0 --把类似拾零萬或佰零萬或仟零萬中间的零清空掉
          begin
            select @upperstr = stuff(@upperstr,patindex(N'%[仟佰拾]零[沟穰杼垓京兆亿萬]%',@upperstr)+1,1,'')
          end
      if patindex(N'%_零[元]%',@upperstr) <> 0 --把类似拾零元或百零元中间的零清空掉
          begin
            select @upperstr = stuff(@upperstr,patindex(N'%_零[元]%',@upperstr) + 1,1,'')
  end
      else if (patindex(N'零[元]%',@upperstr) <> 0) and (convert(int,right(@lowerstr,4)) <> 0) --判断当前否是零元开头,并且后面的四个小数不为
              begin
          select @upperstr = stuff(@upperstr,patindex(N'零[元]%',@upperstr),2,'') --把零元清空掉
        end
      if right(@upperstr,1) = N'零' set @upperstr = left(@upperstr,len(@upperstr)-1)      --如果最后一位是零也清空掉
      if @upperstr = N'元整' set @upperstr = N'零' + @upperstr                            --如果只是的话,就显示零元整
      return @upperstr      --返回大写金额
end 
 
--测试示例
--Select dbo.LowerToUpper(120000000) --壹亿贰仟萬元整
--Select dbo.LowerToUpper(102000000) --壹亿零贰佰萬元整
--Select dbo.LowerToUpper(100200000) --壹亿零贰拾萬元整
--Select dbo.LowerToUpper(100020000) --壹亿零贰萬元整
--Select dbo.LowerToUpper(100002000) --壹亿贰仟元整
 Select dbo.LowerToUpper(564000.67)
--运行结果
/*
壹亿贰仟萬元整
壹亿零贰佰萬元整
壹亿零贰拾萬元整
壹亿零贰萬元整
壹亿贰仟元整
*/

sql server 数字转大写相关推荐

  1. sql server数字小写人民币转换成大写人民币(两种方式)

    一 create function UpperRMB(@num numeric(14,2)) returns @rmb table( 亿  varchar(2) ,仟万 varchar(2) ,佰万  ...

  2. SQL server 数字转字符串

    在查询数据时,有时会遇到将几个字段进行拼接的情况,这个时候如果有的字段为字符串,有的字段为数值型,拼接时就会报错: select top 100 num 编码,cc 尺寸,paper 纸质,num+c ...

  3. Oracle 9i与MS SQL Server 2000之比较连载五.zz

    http://kb.cnblogs.com/a/1153156 Oracle 9i与MS SQL Server 2000之比较连载五 2008-04-14 18:13 四.Oracle中新的数据库对象 ...

  4. SQL Server时间粒度系列----第9节时间粒度示例演示

    本文目录列表: 1.准备测试数据 2.向测试数据表添加相关时间粒度字段列 3.基于日月季年统计汇总的演示 4.总结语 5.参考清单列表 准备测试数据   为了提供不同时间粒度示例的演示,就需要测试数据 ...

  5. SQL Server时间粒度系列----第7节日历数据表详解

    本文目录列表: 1.时间粒度有关描述 2.时间维度有关功能函数3.日历数据表 4.日历数据表数据填充 5.总结语 6.参考清单列表 时间粒度有关描述   将该系列涉及到的时间粒度以及分钟以下的粒度做个 ...

  6. [MSSQL]SQL Server中的RAND函数的介绍和区间随机数值函数的实现

    转自:http://www.cnblogs.com/dzy863/p/5063558.html 工作中会遇到SQL Server模拟数据生成以及数值列值(如整型.日期和时间数据类型)随机填充等等任务, ...

  7. Excel数字、文本混合列导入SQL Server出现的问题&解决办法

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://annie-out.blogbus.com/logs/60276495.html Excel文件: 序号 姓名 内部电话 ...

  8. + ,- (加号,减号) 是数字类型吗?(sql server 2000中)

    今天调试存储过程,发现了一个奇怪的问题,大家都知道的函数 isnumeric 它的用途是:确定表达式是否为一个有效的数字类型,可我用 isnumeric('+') 得到的结果却是 1 ,也就是说 + ...

  9. Excel导入SQL SERVER,数字和字符会被系统自动置为NULL的解决方法

    在Excel中,我们时常会碰到这样的字段(最常见的就是电话号码),即有纯数字的(如没有带区号的电话号码),又有数字和其它字符混合 (如"区号-电 话号码")的数据,在导入SQLSe ...

最新文章

  1. Js中去除数组中重复元素的几种方法
  2. JavaScript学习笔记07【6个经典案例——电灯开关、轮播图、自动跳转首页、动态表格、表格全选、表单验证】
  3. PostgreSQL的高可用与数据复制方案
  4. 主流Java学习路线
  5. php get请求 json返回,[1.23]-请求和响应:GET和POST两者皆可得及超越JSON格式返回 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...
  6. BZOJ3223文艺平衡树——非旋转treap
  7. 什么?是Transformer位置编码
  8. 基于SNMP协议的电信网络监测系统的实现
  9. vcenter 进入 Linux 操作模式
  10. ffmpeg mp4视频流解码
  11. 在计算机领域黑箱,计算机模拟电学黑箱
  12. 今日金融词汇---前复权,是什么?
  13. MySQL用户权限系统
  14. STP配置 HSRP配置 端口追踪
  15. python核心编程电子书_Python核心编程 PDF 超清第3版
  16. 【推荐算法】Knowledge-aware Graph Neural Networks with Label Smoothness Regularization(KGNN-LS)论文笔记
  17. 小米抢发全尺寸人形机器人,全方面转型!
  18. Oracle 实用技巧之不知道密码情况下 dblink 的迁移
  19. css3 制作音乐播放器音乐播放跳动音符
  20. 十一届蓝桥模拟赛 元辅音字母 JAVA

热门文章

  1. 交换机与路由器配置-利用OSPF协议实现网络互联
  2. STL(lower_bound)运行时错误
  3. java心跳监控服务_JavaHeartBeat-应用服务器心跳检测
  4. Windows系统管理和网络服务笔记生涯 源于BENET2.0课程(S1)
  5. android 行车记录仪分析,基于Android的智能行车记录仪的设计与实现.doc
  6. 给女友的网页小惊喜,(生日,周年,表白通用) ☞谁说程序员不懂浪漫
  7. Win10远程桌面,用户账户无效的解决方法
  8. QCC305x系列开发教程(入门篇)之1.2-安装开发中需要配套软件
  9. 阿里巴巴2019实习生招聘正式启动!
  10. 基于51单片机的大棚环境土壤湿度光强监测系统proteus仿真原理图PCB