2016-03-07 18 views
0

我有一個存儲過程,我開始發現難以維護。目標是用日,月和年存儲的值更新Stats表中的值。DRY SQL存儲過程;非常類似的UPDATE語句

這意味着我寫了3次基本相同的WHERE子句,只有日期比較部分和相應的DateType不同。每次我需要更改where子句時,我必須在3個地方進行相同的更改。我有很多不同的統計數據,客戶要求我們經常更換它們。以下是我今天/每月/每年創建的男性聯繫人的統計信息。

E.g:

UPDATE Stats 
    SET Content = (SELECT COUNT(*) FROM Contacts 
        WHERE Gender=1 AND DATEDIFF(DAY, GetDate(), Created) = 0) 
WHERE DateType = 1 AND StatType = 1 

UPDATE Stats 
    SET Content = (SELECT COUNT(*) FROM Contacts 
        WHERE DATEDIFF(MONTH, GetDate(), Created) = 0) 
WHERE DateType = 2 AND StatType = 1 

UPDATE Stats 
    SET Content = (SELECT COUNT(*) FROM Contacts 
        WHERE DATEDIFF(YEAR, GetDate(), Created) = 0) 
WHERE DateType = 3 AND StatType = 1 

我想什麼(但不知道怎麼寫)是某種存儲過程中,我可以通過僅僅一次我的條款,即exec sp_updateStatsDayMonthYear 'SELECT COUNT(*) FROM Contacts WHERE Gender=1'

+0

如果你想打電話給你不妨考慮一下動態SQL存儲過程,你爲什麼要這麼做?爲什麼不用VIEW或TVF即時獲取這些值?有多少行,有多少個新插入? – Shnugo

+0

@Shnugo我們這樣做是因爲有大約25個數據,每個數據都是按日/月/年來完成的,而且這個數字只會越來越大。對於用戶而言,這需要很長的時間(它們比今天創建的用戶數量要複雜得多),所以我們每天早上計算一次前一天的數據。 – James

+0

一種方法是使用日曆表。您在創建時加入您的日曆表,結果是您的數據被放入適當的桶中。你可以把'DateType'放到日曆表中。 –

回答

0

嘗試使用case語句:

UPDATE Stats 
SET Content = case 
when 
DateType=1 AND StatType=1 
then (select count(*) from contacts where DATEDIFF(DAY,GetDate(),Created)=0)) 
when 
DateType=2 AND StatType=1 
then (select count(*) from contacts where DATEDIFF(DAY,GetDate(),Created)=0)) 
when 
DateType=3 AND StatType=1 
then (select count(*) from contacts where DATEDIFF(DAY,GetDate(),Created)=0)) 
end 
+0

這是一個案例表達式,而不是case語句。 – jarlh

+0

雖然這有同樣的問題。如果我想將其更改爲所有女性聯繫人,我現在需要更改3個子句。 *我更新了我的問題以使這個更清晰* – James