2010-07-06 84 views
15

我要檢查表PREMIUM_SERVICE_USER記錄是否存在 strClientID更新timeValid爲+30如果strClientID插入到premium_service_user表中沒有任何記錄。檢查是否存在記錄,如果是「更新」,如果沒有「插入」

我在做什麼錯?

它增加timeValid爲+30天,但也插入另一行。

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

除了下面找到了修復,我也建議你結合UPDATE語句成PREMIUM_SERVICE_USER – 2010-07-06 19:58:33

回答

15

你的問題是跑第一if不考慮@pre_var值。

這是一個稍微不同的方式,如果PREMIUM_SERVICE_USER很大,效率會稍高一點。

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

謝謝:)這完全有效 – 2010-07-06 19:14:00

1

您正在對行進行計數,但沒有在您的決策中使用它。這裏是一個決策結構可能有用

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 

或者這一個..

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

一個單獨的語句,但如果計數返回我1,則意味着存在記錄表上。我想要做的是如果表上存在行更新。你的建議是否意味着如果計數返回0更新? – 2010-07-06 18:58:49

0

看起來您正在檢查第一個IF語句中的錯誤變量。如果@Premium = 1,那麼你會看到這種行爲。

/* 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 
相關問題