2013-05-08 6 views
0

Je voulais savoir si cela est possible de le faire dans SQL Server:SQL Server procédure stockée/curseur

Ma table ressemble à ceci:

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 
) 

Je voulais savoir s'il est possible d'utiliser une procédure stockée avec ou sans un curseur à l'intérieur de celle-ci pour changer la colonne Member_Blacklisted si le Last_Payment était plus de 6 mois à compter de la date qui doit être insérée par exemple

DECLARE @MemberID int,@Date datetime 

Ma tentative à ce jour:

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

Découvrez la réponse de beezir. Il fera ce que tu veux. Actuellement, votre comparaison de date est absurde parce que vous comparez une date à un int. Lorsque vous faites cela, vous comparez le nombre de jours depuis le 1er janvier 1900 contre un nombre compris entre 1 et 12. Votre contrôle de comparaison sera toujours vrai. –

Répondre

4

Essayez ceci:

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

Je pense qu'utiliser DatePart est une mauvaise idée ici car ils peuvent aller de 6 à 7 mois en retard, mais vu que c'est la logique que l'OP utilisait, c'est correct. –

+0

@ Love2Learn Oui, je viens de copier la logique de la question. Changement pour utiliser DATEADD à la place. – beezir

+0

Ouais, sympa, je pense que la logique de l'OP est en fait complètement fausse, car ils retournent un int associé au mois six mois dans le futur et le comparent avec le Last_Payment qui est vraiment non-sens. Je pense que c'est ce qu'ils veulent. –