2010-07-06 5 views
15

Je veux vérifier la table PREMIUM_SERVICE_USER si un enregistrement existe pour strClientID mise à jour timeValid pour +30 si aucun enregistrement pour strClientID insertion à la table premium_service_user.Vérifiez si l'enregistrement existe, si oui « mise à jour » sinon « insérer »

Qu'est-ce que je fais mal?

Il augmente timeValid pendant +30 jours, mais insère également une autre ligne.

SELECT @pre_var = count(*) 
FROM PREMIUM_SERVICE_USER 
WHERE strClientID = @strClientID 

/* bronze premium - 200 cash */ 
IF @Premium = 1 
BEGIN 
    INSERT INTO PREMIUM_SERVICE_USER 
     (strClientID, timeReg, timeValid, bCurrent, durum) 
    VALUES 
     (@strClientID,getdate(),getdate() + 30,'1','1') 

    UPDATE TB_USER 
    SET cash = cash+200 
    WHERE strAccountID = @strClientID 
END 

IF @Premium = 1 AND @pre_var = 1 
BEGIN 
    UPDATE PREMIUM_SERVICE_USER 
     SET timevalid = timevalid+30 where strClientID = @strClientID 
    UPDATE PREMIUM_SERVICE_USER 
     SET bCurrent = 1 where strClientID = @strClientID 
    UPDATE TB_USER 
     SET cash = cash+200 WHERE strAccountID = @strClientID 
END 
+0

En plus de la solution trouvée ci-dessous, je suggère que vous combinez les instructions UPDATE en une seule déclaration pour PREMIUM_SERVICE_USER –

Répondre

15

Votre problème a été exécuté la première if sans tenir compte de la valeur de @pre_var.

C'est une manière légèrement différente de le faire qui sera légèrement plus efficace si PREMIUM_SERVICE_USER est grand.

if @Premium = 1 
    begin 
    if exists(Select 1 From PREMIUM_SERVICE_USER Where strClientID = @strClientID) 
     BEGIN 
     update PREMIUM_SERVICE_USER set timevalid = timevalid+30 where strClientID = @strClientID 
     update PREMIUM_SERVICE_USER set bCurrent = 1 where strClientID = @strClientID 
     UPDATE TB_USER SET cash = cash+200 WHERE strAccountID = @strClientID 
     END 
    ELSE 
     BEGIN 
     INSERT INTO PREMIUM_SERVICE_USER (strClientID, timeReg, timeValid, bCurrent, durum) VALUES (@strClientID,getdate(),getdate() + 30,'1','1') 
     UPDATE TB_USER SET cash = cash+200 WHERE strAccountID = @strClientID 
     END 
    end 
+0

merci :) cela fonctionne totalement –

1

Vous comptez les lignes, mais vous ne les utilisez pas lors de la prise de décision. Voici une structure de décision qui peut être utile

Select @pre_var = count(*) From PREMIUM_SERVICE_USER Where strClientID = @strClientID 

IF @pre_var = 0 
BEGIN 
    /* Run Insert Code Here */ 
END 
ELSE 
BEGIN 
    /* Run Update Code Here */ 
END 


IF @Premium = 1 
BEGIN 
    /* Run Premier Members Update Code Here */ 
END 
ELSE 
BEGIN 
    /* Run Non-Premier Members Update Code Here */ 
END 

Ou celui-ci ..

IF @pre_var = 0 
BEGIN 
    /* Run Insert Code Here */ 
END 
ELSE 
BEGIN 
    IF @Premium = 1 
    BEGIN 
     /* Run Premier Members Update Code Here */ 
    END 
    ELSE 
    BEGIN 
     /* Run Non-Premier Members Update Code Here */ 
    END 
END 
+0

mais si comte me renvoie 1 cela signifie enregistrement existe sur la table. Je veux faire est si la ligne existe sur la table faire la mise à jour. doesnt votre suggestion signifie que si count renvoie 0 faire la mise à jour? –

0

On dirait que vous vérifiez la mauvaise variable dans la première déclaration IF. Si @Premium = 1 alors vous verrez ce comportement.

/* bronze premium - 200 cash */ 
IF @pre_var = 0 
BEGIN 
INSERT INTO PREMIUM_SERVICE_USER (strClientID, timeReg, timeValid, bCurrent, durum) VALUES (@strClientID,getdate(),getdate() + 30,'1','1') 
UPDATE TB_USER SET cash = cash+200 WHERE strAccountID = @strClientID 
END 

IF @Premium = 1 AND @pre_var = 1 
BEGIN 
update PREMIUM_SERVICE_USER set timevalid = timevalid+30 where strClientID = @strClientID 
update PREMIUM_SERVICE_USER set bCurrent = 1 where strClientID = @strClientID 
UPDATE TB_USER SET cash = cash+200 WHERE strAccountID = @strClientID 
END 
5
CREATE PROCEDURE sp_UpdateProcessed 
AS 
BEGIN 
    DECLARE @Processed_Status NVARCHAR(256) 
    SET @Processed_Status = 'ACTIVE' 
    IF(@Processed_Status <> 'Processed') 
    BEGIN 
     SET @Processed_Status = 'Active' 
     UPDATE ST_JnlMediumMoveNew 
     SET ST_JnlMediumMoveNew.Process_Status = @Processed_Status 
    END 
END 
Questions connexes