簡體   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