2013-05-08 95 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