2014-02-26 54 views
0

日期更新临时表,我有两个表:存储过程基于SQL Server中

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 
+0

你必须使用存储过程和游标吗?这是一个简单的查询,没有游标开销。 – Sparky

+0

你能多解释一下吗?我必须使用带有日期参数的存储过程。 – user2988649

回答

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 [email protected] or [email protected] 

同类型总目标操作的计算匹配的数量等

您可能会遇到的问题如果由于某种原因,球队记录没有更新,球队中列出的比赛数量可能会不同于比赛总数的比赛数量。