2013-05-08 90 views
0

我想知道這是否可能在SQL Server中要做到:SQL Server存儲過程/光標

我的表看起來像這樣:

CREATE TABLE MEMBERSHIP 
(
    Memebership_ID INT IDENTITY(1,1)PRIMARY KEY NOT NULL, 
    MemberShip_Expiry_Date Datetime, 
    Member_Account_Balance Money, 
    Member_Blacklisted bit ,--(0 for no, 1 for yes) 
    Customer_ID INT not null, 
    Last_Payment datetime 
) 

我想知道是否可以使用如果Last_Payment距離插入日期超過6個月,則在其中有或沒有遊標的存儲過程更改Member_Blacklisted

DECLARE @MemberID int,@Date datetime 

我迄今爲止嘗試:

DECLARE @MemberID int,@Date datetime 

-- Declaring the Cursor. 
DECLARE C_Expired_Penalty_BlackList CURSOR 
FOR 
(
SELECT 
FROM MEMBERSHIP 
) 

-- Open the Cursor declared. 
OPEN C_Expired_Penalty_BlackList 
FETCH NEXT FROM C_Expired_Penalty_BlackList INTO @MemberID,@Date 
WHILE @@FETCH_STATUS = 0 
BEGIN 
IF @Date > DATEPART(MONTH,getdate()+6) 
BEGIN 
    update MEMBERSHIP 
    set Member_Blacklisted = 1 
    Where Memebership_ID = @MemberID 
END 
    FETCH NEXT FROM C_Expired_Penalty_BlackList INTO @MemberID,@Date 
END 

CLOSE C_Expired_Penalty_BlackList 
DEALLOCATE C_Expired_Penalty_BlackList 
+0

退房beezir的答案。它會做你想做的。目前您的日期比較是無意義的,因爲您將日期與int進行比較。當你這樣做時,你將自1900年1月1日以來的天數與1到12之間的數字進行比較。你的比較檢查將始終爲真。 – 2013-05-08 19:05:05

回答

4

試試這個:

UPDATE MEMBERSHIP 
SET Member_Blacklisted = 1 
WHERE Last_Payment < DATEADD(Month, -6, GETDATE()) 
+0

我認爲使用DatePart在這裏是一個糟糕的主意,因爲它們的範圍可以從6到7個月不等,但考慮到OP使用的邏輯是正確的。 – 2013-05-08 18:56:37

+0

@ Love2學習是的,我只是複製了問題的邏輯。改爲使用DATEADD。 – beezir 2013-05-08 18:58:21

+0

是的,很好,我認爲OP的邏輯實際上是完全錯誤的,因爲它們會返回一個與未來六個月相關的int值,並將其與Last_Payment進行比較,這非常不合理。我認爲這是他們想要的。 – 2013-05-08 19:00:13