读书人

请高手帮忙让小弟我这个程序跑快点

发布时间: 2012-01-02 22:40:04 作者: rapoo

请高手帮忙,让我这个程序跑快点
我的表结构为:ID L1 L2 L3 L4 L5 L6 M
代码的意思是:
查找出每行L1 L2 L3 L4 L5 L6的最大值,如果L1最大,则给M赋值1
如果L2最大,则给M赋值2
以此类推。
我的代码为:
CREATE procedure sel as
declare @index integer
declare @a float
declare @b float
declare @c float
declare @d float
declare @e float
declare @f float

set @index = 1
while(@index < 1297797)
begin
set @a =(select L1 from vv where ID = @index)
set @b =(select L2 from vv where ID = @index)
set @c =(select L3 from vv where ID = @index)
set @d =(select L4 from vv where ID = @index)
set @e =(select L5 from vv where ID = @index)
set @f =(select L6 from vv where ID = @index)
if(@a > = @b AND @a > = @c AND @a > = @d AND @a > =@e AND @a > = @f)
begin
update vv
set M = 1 where ID = @index
end
else if(@b > = @a AND @b > = @c AND @b > = @d AND @b > =@e AND @b > = @f)
begin
update vv
set M = 2 where ID = @index
end
else if(@c > =@a AND @c > = @b AND @c > = @d AND @c > =@e AND @c > = @f)
begin
update vv
set M = 3 where ID = @index
end
else if(@d > = @a AND @d > = @b AND @d > = @c AND @d > =@e AND @d > = @f)
begin
update vv
set M = 4 where ID = @index
end
else if(@e > = @a AND @e > =@b AND @e > = @c AND @e > =@d AND @e > = @f)


begin
update vv
set M = 5 where ID = @index
end
else (@f > = @a AND @f > = @b AND @f > = @c AND @f > =@d AND @f > = @e)
begin
update vv
set M = 6 where ID = @index
end

set @index = @index + 1
end
GO

这代码能运行,但我觉得太慢了。1百万多行要很长时间才能弄完。
求助高手给我建议!!

[解决办法]
--建立一个函数
CREATE FUNCTION F_MAXINT(@L1 INT,@L2 INT,@L3 INT,@L4 INT,@L5 INT,@L6 INT)
RETURNS INT
AS
BEGIN
DECLARE @MAX INT
SET @MAX = @L1
IF @MAX < @L2 SET @MAX = @L2
IF @MAX < @L3 SET @MAX = @L3
IF @MAX < @L4 SET @MAX = @L4
IF @MAX < @L5 SET @MAX = @L5
IF @MAX < @L6 SET @MAX = @L6

RETURN @MAX
END
GO


--测试
DECLARE @T TABLE ([ID] INT IDENTITY,L1 INT,L2 INT,L3 INT,L4 INT,L5 INT,L6 INT,M INT)
INSERT INTO @T(L1,L2,L3,L4,L5,L6)
SELECT 1,2,3,4,5,6 UNION ALL
SELECT 2,3,4,5,6,7 UNION ALL
SELECT 3,4,5,8,1,2 UNION ALL
SELECT 4,5,6,9,2,3 UNION ALL
SELECT 5,6,1,10,3,4 UNION ALL
SELECT 11,1,2,3,4,5


--SELECT M = DBO.F_MAXINT(L1,L2,L3,L4,L5,L6) FROM @T
UPDATE @T SET M = DBO.F_MAXINT(L1,L2,L3,L4,L5,L6)

SELECT * FROM @T

读书人网 >SQL Server

热点推荐