2017-07-05 2 views
1

Ich habe eine Tabelle, die bestimmten Benutzern Rollen zuweist. Ich tue Massenaktualisierung zu dieser Tabelle, wo ich am Ende einige vorherige Rollen von Benutzern verabrede und danach die Zuweisung neuer Rollen durch Einfügen in diese Tabelle beende.IF EXISTS dann Update sonst nichts tun - SQL SERVER 2012

Ich mache beide diese Aktionen separat. Für meine erste Aktion geht mein Code so.

UPDATE userrolelist 
SET effectiveend = '2016-01-20 00:00:00.000' 
where userid IN ('150920','160847','160848','160849') 
and roleid = '1037' and effectiveend IS NULL 

Dies funktioniert, wenn kein Enddatum dieser Rolle zugewiesen ist, aber wenn es ein Enddatum für noch 1 Benutzer ist die gesamte Update-Anweisung beendet. Ich möchte eine IF EXISTS-Anweisung verwenden, um zuerst zu überprüfen, ob ein Enddatum für diesen Benutzer und diese Rolle existiert, wenn nicht, dann führe das Update sonst nichts aus.

Das Einfügen ist ähnlich. Ich führe 100 Einfügungen basierend auf dem Benutzer durch, die neue Rollen haben müssen. Nun, wenn ich diese Insert-Anweisungen erneut ausfühle, wenn es irgendwelche Duplikate findet, wird es fehlerhaft.

Insert into userrolelist (Userid, Roleid, IsDefault, EffectiveStart, 
EffectiveEnd, Clientid, LastmodifiedUserId, LastmodifiedTimestamp) 
Values 
(161514,1011,1,'2016-01-21 00:00:00.001',Null,16785,0,'2016-01-21 
00:00:00.001') 

Tabellenstruktur:

Table Structure

+1

Das ist sehr seltsam scheint. Die Tatsache, dass Sie Datensätze haben, die nicht zu den Bedingungen in der where-Klausel passen, sollte die Aktualisierung der Datensätze nicht beeinflussen, die passt. –

+0

Ja - bitte klären Sie, welche Datensätze Sie aktualisieren möchten. Der Code, den du gepostet hast, sollte funktionieren. Was versuchst du (im Detail) zu erreichen? –

+0

@ ZoharPeled- Also im Grunde, wie ich schon sagte, ich versuche MASS Update/Enddatum Rollen und dann neue Rollen von einigen Benutzern einfügen. Jetzt ist das Problem hier für einige Benutzer HR möglicherweise von der FRONT END gegangen und manuell die Aktion ausgeführt wurde. Wenn ich versuche, das UPDATE und dann das INSERT SCRIPT auszuführen, und wenn einige Mitarbeiter übereinstimmen, die bereits geändert wurden, wird die gesamte UPDATE- und INSERT-Anweisung beendet. –

Antwort

2

Ich bin nicht sicher, ob ich deine Frage richtig verstanden, aber vielleicht können Sie versuchen, diese:

UPDATE A SET EFFECTIVEEND = '2016-01-20 00:00:00.000' 
FROM USERROLELIST A 
WHERE A.USERID IN ('150920','160847','160848','160849') 
AND A.ROLEID = '1037' AND A.EFFECTIVEEND IS NULL 
AND NOT EXISTS(SELECT 1 FROM USERROLELIST B WHERE B.USERID IN ('150920','160847','160848','160849') AND B.effectiveend IS NOT NULL) ; 

Beispieldaten:

CREATE TABLE USERROLELIST (USERID INT, ROLEID INT, EFFECTIVEEND DATETIME); 
INSERT INTO USERROLELIST VALUES (150920, 1037,NULL); 
INSERT INTO USERROLELIST VALUES (160847, 1037,NULL); 
INSERT INTO USERROLELIST VALUES (160848, 1037,NULL); 
INSERT INTO USERROLELIST VALUES (160849, 1037,NULL); 
INSERT INTO USERROLELIST VALUES (160850, 1037,NULL); 

Ausgang:

USERID ROLEID EFFECTIVEEND 
150920 1037 2016-01-20 00:00:00.000 
160847 1037 2016-01-20 00:00:00.000 
160848 1037 2016-01-20 00:00:00.000 
160849 1037 2016-01-20 00:00:00.000 
160850 1037 NULL 

Sample2:

TRUNCATE TABLE USERROLELIST 
INSERT INTO USERROLELIST VALUES (150920, 1037,NULL); 
INSERT INTO USERROLELIST VALUES (160847, 1037,NULL); 
INSERT INTO USERROLELIST VALUES (160848, 1037,NULL); 
INSERT INTO USERROLELIST VALUES (160849, 1037,NULL); 
INSERT INTO USERROLELIST VALUES (160850, 1037,NULL); 
UPDATE USERROLELIST SET EFFECTIVEEND='20160119' WHERE USERID=150920; 

Ausgang:

USERID ROLEID EFFECTIVEEND 
150920 1037 2016-01-19 00:00:00.000 
160847 1037 NULL 
160848 1037 NULL 
160849 1037 NULL 
160850 1037 NULL 
+0

Sind Sie sicher, dass es ein IN in der NOT EXISTS-Abfrage verwenden sollte? Warum verknüpfen Sie es nicht stattdessen mit A.USERID? – LukStorms

+0

@lukStorms Ich denke, er möchte nicht aktualisieren, wenn mindestens eine Benutzer-ID keinen Wert in effectiveend hat. Ich habe Beispieldaten hinzugefügt und in der Antwort – etsa

+0

"mindestens eine" ausgegeben. Ok, macht dann Sinn. – LukStorms

Verwandte Themen