2010-07-06 6 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 –

ответ

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

спасибо :) это полностью работает –

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, что означает, что запись существует на столе. Я хочу сделать, если строка существует в таблице, обновляется. doesnt ur suggestion означает, что если count возвращает 0, обновите? –

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 
Смежные вопросы