2016-05-04 3 views
0

ich überprüfen müssen, ob es ein vorhandener Datensatz in einer Tabelle (für einen Mitarbeiter Auswertung). Wenn ein solcher Datensatz existiert, muss die Abfrage den neuesten Eintrag für diesen Mitarbeiter erfassen und das nächste Startdatum und Enddatum für die nächste Auswertung berechnen. Wenn ein solcher Datensatz nicht existiert, muss die Abfrage eine andere Logik anwenden und ein neues Start- und Enddatum für die erste Auswertung berechnen (vom aktuellen Datum zurückzählen).SQL Server - IF EXISTS ausführt, sowohl den TRUE-Zweig und den falschen Zweig

Um dies zu tun, habe ich den Ausdruck IF EXISTS in SQL Server, aber es schien, dass, wenn ich den gleichen Namen für die Startdatum und Enddatum Variablen behielt, SQL sie überschreiben würde (also die Verzweigungen sequentiell ausgeführt wurde) , nicht den einen oder anderen auswählend). Also habe ich 2 Gruppen von Variablen deklariert, um dieses Problem zu lösen. SQL Server scheint jedoch weiterhin ein Startdatum und ein Enddatum für jeden Fall zu berechnen (EXISTS und NOT EXISTS). Ich weiß das, weil ich es gebeten habe, die 4 Variablen zu drucken, und alle wurden mit unterschiedlichen Werten gedruckt. Hier

ist die Erklärung meiner (jetzt) ​​4 Variablen:

IF EXISTS (SELECT main.[login] 
     FROM dbo.EVALUATIONS_TABLE eval 
     WHERE eval.[login] = @login) 
    SET @startdate = DATEADD(day, 1, (SELECT END_DATE FROM (SELECT TOP 1 ID, END_DATE FROM dbo.EVALUATIONS_TABLE WHERE [LOGIN] = @login) lastscorecard)); 
    SET @enddate = DATEADD(day, 10, @startdate); 
ELSE 
    SET @startdate_new = DATEADD(day, -1, GETDATE()); 
    SET @enddate_new = DATEADD(day, -10, @startdate_new); 

Ich habe versucht, den einen oder anderen Satz von Variablen in der Ausgabetabelle Variable einfügen, aber ich hatte immer noch auf dem gleichen verlassen IF EXISTS Logik, die unzuverlässig ist, wie wir oben gesehen haben. Was ist der Grund, warum SQL Server so verwirrt wird? Ich bin offen meine gesamte Logik zu überdenken, um :-)

+2

Ihr Code-Schnipsel sollte einen Fehler auf "else" bekommen, es sei denn, dies ist in einem anderen 'if'-Block eingeschlossen. –

Antwort

2

Sie müssen so ein Durcheinander zu vermeiden/END verwenden beginnen, weil sonst nur die erste Aussage nach dem IF ausgeführt werden wird:

IF EXISTS (SELECT main.[login] 
     FROM dbo.EVALUATIONS_TABLE eval 
     WHERE eval.[login] = @login) BEGIN 
    SET @startdate = DATEADD(day, 1, (SELECT END_DATE FROM (SELECT TOP 1 ID, END_DATE FROM dbo.EVALUATIONS_TABLE WHERE [LOGIN] = @login) lastscorecard)); 
    SET @enddate = DATEADD(day, 10, @startdate); 
END ELSE BEGIN 
    SET @startdate_new = DATEADD(day, -1, GETDATE()); 
    SET @enddate_new = DATEADD(day, -10, @startdate_new); 
END 
+0

Vielen Dank für die schnelle Antwort, @Allan S. Hansen. Ich hatte das Gefühl, dass dies mit "BEGIN" und "END" geschehen musste, aber ich habe auch irgendwo gelesen (vielleicht in einer Antwort von dieser Seite), dass BEGIN und END irrelevant sind. Mir ist klar, dass ich nicht alle Anwendungsfälle als gleichwertig betrachten sollte. Die Funktion funktioniert jetzt einwandfrei. –

+0

BEGIN/END sind definitiv nicht irrelevant :) Es könnte nur in einer anderen Situation irrelevant gewesen sein. Aber, froh, dass Sie helfen können - und auch wenn die Antwort Ihnen geholfen hat, denken Sie bitte daran, einen von ihnen als "akzeptiert" zu betrachten. –

1

Die "offensichtliche" Lösung besteht darin, begin/end für die if-Blöcke zu verwenden. In der Tat würde ich immer mit begin/end mit if zu verhindern Fehler dieser Art empfehlen.

Aber können Sie die von if ganz loszuwerden:

SELECT @startdate = COALESCE(DATEADD(day, 1, MAX(END_DATE)), 
          DATEADD(day, -1 GETDATE) 
          ) 
FROM (SELECT TOP 1 et.* 
     FROM dbo.EVALUATIONS_TABLE et. 
     WHERE [LOGIN] = @login 
    ) l; 

SELECT @enddate = DATEADD(day, -10, @startdate); 
+0

Danke für die Antwort Gordon, ich habe deine Lösung noch nicht getestet, aber ich möchte wirklich in die COALESCE-Funktion schauen, da es so aussieht, als würde es den Code ein wenig vereinfachen. –

0

Iulia Mihet, Sie sollten immer für diese Art von Abfragen BEGIN und END verwenden. Vor allem, wenn Sie eine IF EXISTS-Abfrage verwenden, die bedingt ist. Der Code sollte wie folgt aussehen:

IF EXISTS (SELECT main.[login] 
    FROM dbo.EVALUATIONS_TABLE eval 
    WHERE eval.[login] = @login) 
BEGIN 
SET @startdate = DATEADD(day, 1, (SELECT END_DATE FROM (SELECT TOP 1 ID, END_DATE FROM dbo.EVALUATIONS_TABLE WHERE [LOGIN] = @login) lastscorecard)); 
SET @enddate = DATEADD(day, 10, @startdate); 
END 
ELSE 
BEGIN 
SET @startdate_new = DATEADD(day, -1, GETDATE()); 
SET @enddate_new = DATEADD(day, -10, @startdate_new); 
END 

hoffen, dass es

0

hilft Sie gleichen Variablen verwenden können. Sie haben BEGIN und END. Verwenden Sie unter Abfrage.

IF EXISTS (SELECT main.[login] 
    FROM dbo.EVALUATIONS_TABLE eval 
    WHERE eval.[login] = @login) 
BEGIN 
    SET @startdate = DATEADD(day, 1, (SELECT END_DATE FROM (SELECT TOP 1 ID, END_DATE FROM dbo.EVALUATIONS_TABLE WHERE [LOGIN] = @login) lastscorecard)); 
    SET @enddate = DATEADD(day, 10, @startdate); 
END 
ELSE 
BEGIN 
    SET @startdate = DATEADD(day, -1, GETDATE()); 
    SET @enddate = DATEADD(day, -10, @startdate_new); 
END