2010-07-06 10 views
15

Chcę sprawdzić tabelę PREMIUM_SERVICE_USER jeśli wszelkie rekordy istnieje strClientID aktualizacji timeValid do +30 jeśli ma zapisów do strClientID Włożyć do premium_service_user tabeli.Sprawdź, czy rekord istnieje, jeżeli tak „update” jeśli nie „wstawić”

Co robię źle?

Zwiększa się o timeValid przez +30 dni, ale wstawia też inny wiersz.

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

Oprócz poprawki znaleźć poniżej Chciałbym również zasugerować, że można połączyć sprawozdania Update w jednej instrukcji dla PREMIUM_SERVICE_USER –

Odpowiedz

15

Twój problem został uruchomiony pierwszy if bez względu na wartość @pre_var.

To jest nieco inny sposób robienia tego, który będzie nieco bardziej wydajny, jeśli PREMIUM_SERVICE_USER jest duży.

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

dziękuję :) to działa całkowicie –

1

Liczysz wiersze, ale nie używasz ich do podejmowania decyzji. Oto struktura decyzja, która może być przydatna

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 

Albo ten jeden ..

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

ale jeśli count zwraca mi 1 oznacza, że ​​rekord istnieje w tabeli. Chcę zrobić, jeśli wiersz istnieje na stole do aktualizacji. nie ma sugestii oznaczającej, czy liczba zwraca 0 czy aktualizacja? –

0

Wygląda na to, że sprawdzasz niewłaściwą zmienną w pierwszej instrukcji IF. Jeśli @Premium = 1, zobaczysz to zachowanie.

/* 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