SQL Server INDIEN BESTAAT NIET Gebruik?

Ok, dus mijn schema is dit:

Tabel: Timesheet_Hours

Kolommen:

  • Timesheet_Id (PK, int)
  • Staff_Id (int)
  • BookedHours (int)
  • Posted_Flag (boolean)

Dit is een extreem vereenvoudigde versie van de tabel, maar het zal dienen voor de doeleinden van deze uitleg. Neem aan dat een persoon maar één roosterrecord kan hebben.

Wat ik probeer te doen is records toevoegen aan een andere tabel, WorkLog genaamd. Aan elk record hier is een tijd gekoppeld. Als die tabel is bijgewerkt, wil ik ook Timesheet_Hours bijwerken.

Voordat ik Timesheet_Hours update, wil ik eerst controleren of de relevante Timesheets nog niet zijn gepost, en dan wil ik controleren of er in de eerste plaats een record is om bij te werken.

Het eerste deel van het if-statement, dat controleert of de timesheets nog niet zijn gepost, werkt prima. Het probleem is het tweede deel. Het controleert of het record dat het gaat bijwerken al bestaat. Het probleem is dat er altijd een fout optreedt.

NB: De onderstaande code is geëxtraheerd uit een opgeslagen procedure die wordt uitgevoerd door de update-, insert- en delete-triggers in de WorkLog-tabel. @PersonID is een van de parameters voor die tabel. De opgeslagen procedure werkt prima als ik commentaar geef op het tweede deel van deze verklaring.

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

Antwoord 1, autoriteit 100%

Heb je gecontroleerd of er inderdaad een rij is waar Staff_Id = @PersonID? Wat je hebt gepost werkt prima in een testscript, ervan uitgaande dat de rij bestaat. Als u commentaar geeft op de insert-instructie, wordt de fout weergegeven.

set nocount on
create table Timesheet_Hours (Staff_Id int, BookedHours int, Posted_Flag bit)
insert into Timesheet_Hours (Staff_Id, BookedHours, Posted_Flag) values (1, 5.5, 0)
declare @PersonID int
set @PersonID = 1
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
    ELSE
        print 'No problems here'
drop table Timesheet_Hours

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes