标题 | sql server函数将人民币数字转换成大写形式 |
范文 | 1、sql 数据库中的存储过程的参数问题 怎么将sql数据库中的存储过程中的参数既作为输出变量又作为输出变量? [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, --输入参数 @out_p, --输出参数 @in_out_p --输入,输出参数 /* (无列名) (无列名) (无列名) 1 3 4 */ 2、在存储过程中的参数问题。 下面是问题: [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参数等于 小明,23岁,还有id在(1,3)的时候 --我怎么可以弄成可选的参数 --比如,name不为空时候 select *from #tabletest where 1=1 and name like '小明' --如果name参数为空的时候,ids参数不为空的时候 select *from #tabletest where 1=1 and id in(1,3) --请问一下,就有参数不为空的时候存储过程中的sql追加条件,为空的时候就不追加,这样带可选参数的存储过程怎么写,以及怎么调用,请帮小弟写一个实例 这种问题,本质上就是根据传入的参数不同,进行不同的查询,也就是where 后面的查询条件是动态的。 一般有2中处理方式,一种就是写动态语句,但动态语句由于是动态拼接字符串,所以比较难维护,而且如果存储过程需要执行多次,那么每次都需要重新编译,但每次生成的执行计划,应该是比较优化的。但如果拼接字符串部分,只是少量的话,还是可以用动态语句的,下面我的解法就是用动态语句来实现的,结构清晰,易于维护。 另一种,就是通过在where语句后面写case when来进行判断,这种方法的好处是不用动态拼接语句,但不易于理解,也不易于修改,因为别人不一定能理解你这么写的意思。另一个问题就是性能的问题,因为在原来的公司就用过这种方法,一段时间后,查询非常慢,本来几秒就能出结果,后来几分钟都出不了结果。说实在的,这种方法要求较高的技巧性,也容易出错,不建议使用。 下面是我的解法,用了动态语句来实现,但考虑了维护、测试方面的要求: [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 '语句' --执行语句 --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函数将人民币数字转换成大写形式 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='(负数)'+@c_data if @num=0 set @c_data='零圆' if @n_str='0' set @c_data=@c_data+'整' return(@c_data) end sql server函数将人民币数字转换成大写形式 闲着也是闲着,欢迎大家多提宝贵意见 --阿拉伯数字转中文大写数字 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参数连接查询,sql语句可写如下 set @sql= @sql + case when @sellernick <> '' then ' and sellernick = ' else ' ' end set @sql= @sql + case when @logisticsid <> '' then ' and logisticsid = else ' ' end |
随便看 |
|
在线学习网范文大全提供好词好句、学习总结、工作总结、演讲稿等写作素材及范文模板,是学习及工作的有利工具。