Проверьте, существует ли запись, если да "обновить", если нет "вставить",
Я хочу проверить таблицу 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
Ответы
Ответ 1
В вашей проблеме был запущен первый 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
Ответ 2
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
Ответ 3
Вы считаете строки, но не используете их при принятии решений. Вот структура решения, которая может быть полезна
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
Ответ 4
Похоже, вы проверяете неправильную переменную в первом заявлении 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