求一SQLserver中比较大小的函数

lfecnu 2003-11-17 05:43:56
目的:根据输入的若干个数 比较得到最大的数
要求:输入的数的数目不固定 可能3个也可能5个或更多
e.g maxNumber=testmax(2,3,5,8,15,45)
返回45
谢谢!
...全文
1171 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lfecnu 2003-11-18
  • 打赏
  • 举报
回复
更正:是我测试时出了问题,pengdali(大力 V3.0)的函数执行速度没有问题。
谢谢 pengdali(大力 V3.0)、txlicenhe(马可)!
lfecnu 2003-11-18
  • 打赏
  • 举报
回复
pengdali(大力 V3.0)的函数执行速度不行
在txlicenhe(马可) 的函数基础上再添加点东西就比较好了:
create function Find_Max(@SourceNumber varchar(8000))
returns decimal(10,4)
as
begin
declare @fmax decimal(10,4)
set @fmax=(Select max(cast(F1 as decimal(10,4))) from (select * from dbo.f_splitstr(@sourceNumber,',')) aa)
return @fmax
end
go
print dbo.Find_Max('1,6,48.3596,-99.25')

lfhh 2003-11-17
  • 打赏
  • 举报
回复
佩服!
学习!
java521java 2003-11-17
  • 打赏
  • 举报
回复
我太菜。 帮不了啊!
pengdali 2003-11-17
  • 打赏
  • 举报
回复
create function getmax(@a varchar(8000))
returns int
as
begin
declare @ table (id int identity,a char(1))
declare @t int
insert @ select top 8000 null from sysobjects a,sysobjects b
select @t=max(cast(substring(','+@a,id+1,charindex(',',','+@a+',',id+1)-id-1) as int)) from @ where substring(','+@a,id,8000) like ',_%'
return @t
end
go


--调用:
select dbo.getmax('2342,2334,2344')
pengdali 2003-11-17
  • 打赏
  • 举报
回复
ok
lfhh 2003-11-17
  • 打赏
  • 举报
回复
谢谢pengdali(大力 V3.0)的回复,但我希望用一个函数来完成.
txlicenhe(马可)的思路大概可行 我想把 txlicenhe(马可)的函数是不是还可以在改造一下 以方便调用
pengdali 2003-11-17
  • 打赏
  • 举报
回复
create proc getmax
@a varchar(200),
@c int output
as
declare @b nvarchar(4000)
set @b=N'select max(id) aa from (select '''+replace(@a,',',''' id union all select ''')+''') a'

exec sp_executesql @b,N'@aa int output',@c output
go


--调用:
declare @a int
exec getmax '1,2,34,56',@a output

select @a
pengdali 2003-11-17
  • 打赏
  • 举报
回复
declare @变量 varchar(8000)
set @变量='1,2,34,56'


set @变量='select max(id) 结果 from (select '''+replace(@变量,',',''' id union all select ''')+''') a'

exec(@变量)

/*
结果
----
56*/
txlicenhe 2003-11-17
  • 打赏
  • 举报
回复
create function f_splitstr(@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp table(F1 varchar(100))
as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>''
insert @temp values(@SourceSql)
return
end

-执行方式稍改一下:
Select max(cast(F1 as int)) from (select * from dbo.f_splitstr('2,3,5,8,15,45',',')) aa

-----------
45

(所影响的行数为 1 行)

txlicenhe 2003-11-17
  • 打赏
  • 举报
回复
create function f_splitstr(@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp table(F1 varchar(100))
as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>''
insert @temp values(@SourceSql)
return
end
-执行
然后就可以:
Select max(F1) from (select * from dbo.f_splitstr('2,3,5,8,15,45',',')) aa
shuiniu 2003-11-17
  • 打赏
  • 举报
回复
如果是sql server2000的话,可以写个自定义函数!
shuiniu 2003-11-17
  • 打赏
  • 举报
回复
select max(num)
from
(
select 2 num
union all
select 3
union all
select 5
union all
select 8
union all
select 15
union all
select 45
) a

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧