sql server函數(shù)將人民幣數(shù)字轉(zhuǎn)換成大寫形式

字號:


    1、sql 數(shù)據(jù)庫中的存儲過程的參數(shù)問題
    怎么將sql數(shù)據(jù)庫中的存儲過程中的參數(shù)既作為輸出變量又作為輸出變量?
    [sql] view plaincopy --drop proc proc_test
    --go
    create proc dbo.proc_test
    @in int,
    @out int out,
    @in_out int output
    as
    select @out = @in + @in_out, --1 + 2 = 3
    @in_out = @out + 1 --3 + 1 = 4
    go
    declare @in_p int
    declare @out_p int
    declare @in_out_p int
    set @in_p = 1;
    set @in_out_p = 2
    exec dbo.proc_test @in_p,
    @out_p out,
    @in_out_p output
    select @in_p, --輸入?yún)?shù)
    @out_p, --輸出參數(shù)
    @in_out_p --輸入,輸出參數(shù)
    /*
    (無列名) (無列名) (無列名)
    1 3 4
    */
    2、在存儲過程中的參數(shù)問題。
    下面是問題:
    [sql] view plaincopy create table #tabletest(id int identity , name varchar(20),age int,)
    go
    insert into #tabletest
    select '小明',23 union all
    select '小紅',28 union all
    select '小軍',27
    go
    select *from #tabletest
    go
    create proc proctest
    @name varchar(20),
    @age int,
    @ids varchar(30)
    as
    begin
    select *from #tabletest where 1=1
    end
    --當我傳入@name參數(shù)等于 小明,23歲,還有id在(1,3)的時候
    --我怎么可以弄成可選的參數(shù)
    --比如,name不為空時候
    select *from #tabletest where 1=1 and name like '小明'
    --如果name參數(shù)為空的時候,ids參數(shù)不為空的時候
    select *from #tabletest where 1=1 and id in(1,3)
    --請問一下,就有參數(shù)不為空的時候存儲過程中的sql追加條件,為空的時候就不追加,這樣帶可選參數(shù)的存儲過程怎么寫,以及怎么調(diào)用,請幫小弟寫一個實例
    這種問題,本質(zhì)上就是根據(jù)傳入的參數(shù)不同,進行不同的查詢,也就是where 后面的查詢條件是動態(tài)的。
    一般有2中處理方式,一種就是寫動態(tài)語句,但動態(tài)語句由于是動態(tài)拼接字符串,所以比較難維護,而且如果存儲過程需要執(zhí)行多次,那么每次都需要重新編譯,但每次生成的執(zhí)行計劃,應該是比較優(yōu)化的。但如果拼接字符串部分,只是少量的話,還是可以用動態(tài)語句的,下面我的解法就是用動態(tài)語句來實現(xiàn)的,結(jié)構(gòu)清晰,易于維護。
    另一種,就是通過在where語句后面寫case when來進行判斷,這種方法的好處是不用動態(tài)拼接語句,但不易于理解,也不易于修改,因為別人不一定能理解你這么寫的意思。另一個問題就是性能的問題,因為在原來的公司就用過這種方法,一段時間后,查詢非常慢,本來幾秒就能出結(jié)果,后來幾分鐘都出不了結(jié)果。說實在的,這種方法要求較高的技巧性,也容易出錯,不建議使用。
    下面是我的解法,用了動態(tài)語句來實現(xiàn),但考慮了維護、測試方面的要求:
    [sql] view plaincopy --drop table #tabletest
    create table #tabletest(id int identity , name varchar(20),age int,)
    go
    insert into #tabletest
    select '小明',23 union all
    select '小紅',28 union all
    select '小軍',27
    go
    select *from #tabletest
    go
    create proc proctest
    @name varchar(20)=null,@age int = null,@ids varchar(30) = null
    as
    declare @sql nvarchar(max);
    set @sql = '';
    set @sql = 'select * from #tabletest where 1 = 1';
    set @sql = @sql +
    case when @name is not null
    then ' and name like ' + quotename(@name +'%','''')
    when @age is not null
    then ' and age = ' + cast(@age as varchar)
    when @ids is not null
    then ' and id in (' + @ids +')'
    else ' '
    end
    --打印出語句
    select @sql as '語句'
    --執(zhí)行語句
    --exec(@sql)
    go
    exec proctest
    /*
    語句
    select * from #tabletest where 1 = 1
    */
    exec proctest '小明',23
    /*
    語句
    select * from #tabletest where 1 = 1 and name like '小明%'
    */
    exec proctest @ids = '2,3'
    /*
    語句
    select * from sql server函數(shù)將人民幣數(shù)字轉(zhuǎn)換成大寫形式
    create function [dbo].[f_num_chn] (@num numeric(14,5))
    returns varchar(100) with encryption
    as
    begin
    declare @n_data varchar(20),@c_data varchar(100),@n_str varchar(10),@i int
    set @n_data=right(space(14)+cast(cast(abs(@num*100) as bigint) as varchar(20)),14)
    set @c_data=''
    set @i=1
    while @i<=14
    begin
    set @n_str=substring(@n_data,@i,1)
    if @n_str<>' '
    begin
    if not ((substring(@n_data,@i,2)='00') or
    ((@n_str='0') and ((@i=4) or (@i=8) or (@i=12) or (@i=14))))
    set @c_data=@c_data+substring('零壹貳叁肆伍陸柒捌玖',cast(@n_str as int)+1,1)
    if not ((@n_str='0') and (@i<>4) and (@i<>8) and (@i<>12))
    set @c_data=@c_data+substring('仟佰拾億仟佰拾萬仟佰拾圓角分',@i,1)
    if substring(@c_data,len(@c_data)-1,2)='億萬'
    set @c_data=substring(@c_data,1,len(@c_data)-1)
    end
    set @i=@i+1
    end
    if @num<0
    set @c_data='(負數(shù))'+@c_data
    if @num=0
    set @c_data='零圓'
    if @n_str='0'
    set @c_data=@c_data+'整'
    return(@c_data)
    end
    sql server函數(shù)將人民幣數(shù)字轉(zhuǎn)換成大寫形式
    閑著也是閑著,歡迎大家多提寶貴意見
    --阿拉伯數(shù)字轉(zhuǎn)中文大寫數(shù)字
    create function ntocc(@n int)
    returns varchar(2)
    as
    begin
    declare @s varchar(2)
    if @n=0
    set @s=''零''
    if @n=1
    set @s=''壹''
    if @n=2
    set @s=''貳''
    if @n=3
    set @s=''叁''
    if @n=4
    set @s=''肆''
    if @n=5
    set @s=''伍''
    if @n=6
    set @s=''陸''
    if @n=7
    set @s=''柒''
    if @n=8
    set @s=''捌''
    if @n=9
    set @s=''玖''
    return @s
    end
    --可支持到上億
    create function numbertochinesebigstring(@m money)
    returns varchar(255)
    begin
    declare @i varchar(255)
    declare @f varchar(255)
    declare @r varchar(255)
    declare @s varchar(255)
    set @s=convert(varchar(255),@m)
    if charindex(''.'',@s)>0
    begin
    set @i=substring(@s,1,charindex(''.'',@s)-1)
    set @f=substring(@s,charindex(''.'',@s)+1,len(@s))
    end
    else
    set @i=@s
    set @r=''''
    declare @k int
    set @k=len(@i)
    while @k>=1
    begin
    --最多9位
    if @k=9
    set @r=@r+
    dbo.ntocc(convert(int,substring(reverse(@i),@k,1)))
    +''億''
    if @k=8
    set @r=@r+dbo.ntocc(convert(int,substring(reverse(@i),@k,1)))+''千''
    if @k=7
    set @r=@r+dbo.ntocc(convert(int,substring(reverse(@i),@k,1)))+''佰''
    if @k=6
    set @r=@r+dbo.ntocc(convert(int,substring(reverse(@i),@k,1)))+''拾''
    if @k=5
    set @r=@r+dbo.ntocc(convert(int,substring(reverse(@i),@k,1)))+''萬''
    if @k=4
    set @r=@r+dbo.ntocc(convert(int,substring(reverse(@i),@k,1)))+''千''
    if @k=3
    set @r=@r+dbo.ntocc(convert(int,substring(reverse(@i),@k,1)))+''佰''
    if @k=2
    set @r=@r+dbo.ntocc(convert(int,substring(reverse(@i),@k,1)))+''拾''
    if @k=1
    set @r=@r+dbo.ntocc(convert(int,substring(reverse(@i),@k,1)))+''元''
    set @k=@k-1
    end
    if convert(float,@f)=0
    set @r=@r+''整''
    else
    begin
    if substring(@s,1,1)>''''
    set @r=@r+dbo.ntocc(convert(int,substring(@f,1,1)))+''角''
    if substring(@s,2,1)>''''
    set @r=@r+dbo.ntocc(convert(int,substring(@f,2,1)))+''分''
    end#tabletest where 1 = 1 and id in (2,3)
    */
    備注:如遇到需多個and參數(shù)連接查詢,sql語句可寫如下
    set @sql= @sql +
    case when @sellernick <> ''
    then ' and sellernick = '
    else ' '
    end
    set @sql= @sql +
    case when @logisticsid <> ''
    then ' and logisticsid =
    else ' '
    end