Ok, so ist mein Schema folgt aus:SQL Server IF EXISTS Verwendung?
Tabelle: Timesheet_Hours
Spalten:
- Timesheet_Id (PK, int)
- Staff_Id (int)
- BookedHours (int)
- Posted_Flag (boolean)
Dies ist eine extrem vereinfachte Version der Tabelle, aber sie wird für die Zwecke dieser Erklärung dienen. Angenommen, eine Person kann immer nur einen Zeiterfassungssatz haben.
Was ich versuche, ist Datensätze in eine andere Tabelle, genannt WorkLog hinzufügen. Jedem Datensatz ist eine Zeit zugeordnet. Wenn diese Tabelle aktualisiert wird, möchte ich auch Timesheet_Hours aktualisieren.
Bevor ich Timesheet_Hours aktualisiere, möchte ich zuerst überprüfen, dass die relevanten Arbeitszeittabellen nicht bereits gebucht wurden, und dann möchte ich überprüfen, ob tatsächlich ein Datensatz zu aktualisieren ist.
Der erste Teil der if-Anweisung, der prüft, ob die Arbeitszeittabellen nicht bereits gebucht wurden, funktioniert einwandfrei. Das Problem ist der zweite Teil. Es wird überprüft, ob der zu aktualisierende Datensatz bereits existiert. Das Problem ist, dass es immer einen Fehler auslöst.
Hinweis: Der folgende Code wird aus einer gespeicherten Prozedur extrahiert, die von dem Update ausgeführt wird, Trigger in der WorkLog-Tabelle einfügen und löschen. @PersonID ist einer der Parameter für diese Tabelle. Die gespeicherte Prozedur funktioniert einwandfrei, wenn ich den zweiten Teil dieser Anweisung auskommentiere.
IF EXISTS
(
SELECT 1
FROM Timesheet_Hours
WHERE Posted_Flag = 1
AND Staff_Id = @PersonID
)
BEGIN
RAISERROR('Timesheets have already been posted!', 16, 1)
ROLLBACK TRAN
END
ELSE
IF NOT EXISTS
(
SELECT 1
FROM Timesheet_Hours
WHERE Staff_Id = @PersonID
)
BEGIN
RAISERROR('Default list has not been loaded!', 16, 1)
ROLLBACK TRAN
END
Ist 1 der Name einer Spalte in Ihrer Tabelle "Timesheet_Hours"? – SirDemon
Nein, ist es nicht. Da ich EXISTS benutze, habe ich nur das verfolgt, was ich bei Sub-Queries mit EXISTS als Standard annahm. –
1 in diesem Fall ist nur eine Konstante. Alles, was er interessiert, ist, dass eine Zeile zurückgegeben wird, nicht der Wert irgendwelcher Spalten. Die Verwendung einer Konstanten ist normalerweise schneller als die Verwendung von * oder einer bestimmten Spaltenliste. – Rick