2014-02-26 90 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] 

同類型總目標操作的計算匹配的數量等

您可能會遇到的問題如果由於某種原因,球隊記錄沒有更新,球隊中列出的比賽數量可能會不同於比賽總數的比賽數量。