web-dev-qa-db-fra.com

SQL Server SI NON EXISTE Utilisation?

Ok, alors mon schéma est le suivant:

Tableau: Timesheet_Hours

Colonnes:

  • Timesheet_Id (PK, int)
  • Staff_Id (int)
  • RéservéHeures (int)
  • Posté_Flag (booléen)

Ceci est une version extrêmement simplifiée du tableau, mais elle servira aux fins de cette explication. Supposons qu'une personne ne peut avoir qu'un seul enregistrement de feuille de temps.

Ce que j'essaie de faire est d'ajouter des enregistrements à une autre table, appelée WorkLog. Chaque enregistrement ici a un temps associé. Lorsque cette table est mise à jour, je souhaite également mettre à jour Timesheet_Hours.

Avant de mettre à jour Timesheet_Hours, je souhaite d'abord vérifier que les feuilles de temps pertinentes n'ont pas encore été publiées, puis vérifier s'il existe réellement un enregistrement à mettre à jour.

La première partie de l'instruction if, qui vérifie que les feuilles de temps n'ont pas déjà été postées, fonctionne bien. Le problème est la deuxième partie. C'est checkint pour voir que le disque qu'il va mettre à jour existe déjà. Le problème est que cela soulève toujours une erreur.

NB: Le code ci-dessous est extrait d'une procédure stockée exécutée par les déclencheurs update, insert et delete de la table WorkLog. @PersonID est l'un des paramètres de cette table. La procédure stockée fonctionne bien si je commente la deuxième partie de cette déclaration.

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
40
Ryan Kirkman

Avez-vous vérifié qu'il existe en fait une ligne où Staff_Id = @PersonID? Ce que vous avez posté fonctionne bien dans un script de test, en supposant que la ligne existe. Si vous commentez l'instruction insert, l'erreur est alors générée.

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
44
Rick