2010-07-06 11 views
15

Ich möchte Tabelle überprüfen PREMIUM_SERVICE_USER ob Datensätze für strClientID Update existiert timeValid für 30, wenn keine Datensätze für strClientID Einsatz premium_service_user Tisch.Überprüfen Sie, ob Datensatz vorhanden ist, wenn ja „update“, wenn nicht „Einfügen“

Was mache ich falsch?

Es erhöht timeValid für +30 Tage aber fügt eine weitere Zeile ein.

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

Neben dem Update, das unten gefunden, ich würde auch vorschlagen, dass Sie die UPDATE-Anweisungen in einer einzigen Anweisung für PREMIUM_SERVICE_USER –

Antwort

15

Ihr Problem lief die erste if ohne Rücksicht auf den Wert von @pre_var nützlich sein kann.

Dies ist ein etwas anderer Weg, der etwas effizienter ist, wenn PREMIUM_SERVICE_USER groß ist.

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

danke :) das funktioniert total –

1

Sie zählen die Zeilen, aber nicht in Ihrer Entscheidungsfindung. Hier ist eine Entscheidungsstruktur, die

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 

Oder diese ..

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

kombinieren, aber wenn Count me 1 zurückgibt, bedeutet Datensatz vorhanden sind auf dem Tisch. Ich möchte tun, wenn Zeile vorhanden ist auf der Tabelle aktualisieren. doesnt unser Vorschlag bedeutet, wenn Count 0 zurückgibt, aktualisieren? –

0

Sieht aus wie Sie die falsche Variable in der ersten IF-Anweisung überprüfen. Wenn @Premium = 1, dann sehen Sie dieses Verhalten.

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