基于SQL Server中的日期更新临时表的存储过程

时间:2014-02-26 23:11:17

标签: sql stored-procedures

我有两张桌子:

Teams [Id],[name],[nomatches],[owngoals],[othergoals],[points]

Matches[id],[homeid],[outid],[homegoal],[outgoal],[matchdate]

我有一个触发器会在INSERT,UPDATE,DELETE触发,因此Teams表当前得分表始终会更新。

示例:

Select * from teams;

结果:

Name     NumberOfMatches   OwnGoals  OtherGoals  Points
-------------------------------------------------------    
FC Chelsea      33            61          22        68
FC Barcelona    33            46          34        59
FC Man UD       33            57          50        52

问题:

Matches有一列matchdate。我想重新计算输入日期之前所有比赛的当前得分表(可能是我的触发器)。

我不知道如何根据Date参数创建临时表来存储重新计算的数据(nomaches,owngoals,其他目标,每个团队的积分)。

到目前为止我所拥有的:

CREATE PROCEDURE check_scoretable  
( 
    @pDate DATE = NULL
)
as
DECLARE @Date DATE = COALESCE(@pDate,GETDATE())
    declare @homeid char(3);
    declare @outid char(3);
    declare @id int;

        SELECT * INTO #temp_table2  FROM teams;
        SET NOCOUNT ON; -- copy of the teams table 

declare cur CURSOR LOCAL for 
select homeid, outid
from matches where matches.matchdate < @Date
 open cur
 fetch next from cur into @homeid, @outid
 while @@FETCH_STATUS = 0 BEGIN
    select @homeid;
    select @outid;
    --Increment number of matches
    update #temp_table2 set #temp_table2.nomatches = #temp_table2.nomatches+1 where #temp_table2.id = @homeid;
    update #temp_table2 set #temp_table2.nomatches = #temp_table2.nomatches+1 where #temp_table2.id = @outid;

   fetch next from cur into @homeid, @outid
END
close cur
deallocate cur

-- Test the stored procedure
DECLARE @d DATETIME
SELECT @d = GETDATE()
EXEC check_scoretable  @date = @d

1 个答案:

答案 0 :(得分:1)

您可以编写存储过程,就像您已经完成并将日期传递给它一样。

CREATE PROCEDURE check_scoretable  
( 
    @pDate DATE = NULL
)
as

然而,不是光标,而是做

之类的事情
SELECT tm.name,sum(tm.noMatches) as NumberMatches,sum(tm.ownGoals) as OwnGoals,
       sum(tm.otherGoals) as Othergoals,sum(tm.Points) as Points
FROM Team tm
JOIN Matches mc on mc.homeId=tm.id or mc.outId=tm.id
WHERE mc.matchDate <= @pDate

这将为您提供所需的结果。

CAVEAT:您的数据库设计不好,因为其中包含冗余数据。例如,当您可以通过

计算匹配数时,您正在跟踪团队表中的匹配数
SELECT count(*) FROM matches WHERE homeId=@id or OutId=@id

总目标的相同类型的操作等。

您可能遇到的问题是,如果由于某种原因,团队记录未更新,则团队中列出的匹配数可能与总共播放的匹配数相匹配。