繁体   English   中英

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

[英]Stored procedure to update temp table based on Date in SQL Server

我有两个表:

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

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

我有一个触发器,它会在INSERT,UPDATE,DELETE上触发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参数重新计算的数据(每个团队的名次,自有进球,其他进球,得分)。

我到目前为止所拥有的:

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

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

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

总体目标的同类操作,等等。

您可能会遇到的问题是,如果由于某种原因而没有更新团队记录,则团队中列出的比赛数可能不同于将比赛总数相加的比赛数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM