Servidor SQL se não existir Utilização?

Então o meu esquema é este:

Tabela: Timesheet_ Hours

colunas:

  • Timesheet_Id (PK, int)
  • Staff_Id (int)
  • BookedHours (int)
  • Posted_Flag (booleano)
Esta é uma versão extremamente simplificada da tabela, mas servirá para os propósitos desta explicação. Suponha que uma pessoa só pode ter um registro de folha de tempo.

O que estou a tentar fazer é adicionar registos a outra tabela, chamada WorkLog. Cada registro aqui tem um tempo associado a ele. Quando essa tabela é atualizada, eu quero atualizar Timesheet_ hours também.

Antes de actualizar a Timesheet_ hours, quero verificar primeiro que as Timesheets relevantes ainda não foram publicadas, e depois quero verificar se existe de facto um registo para actualizar em primeiro lugar.

a primeira parte da declaração de FI, que verifica se as folhas de tempo ainda não foram postadas, funciona bem. O problema é a segunda parte. É checkint para ver se o registro que ele vai atualizar já existe. A questão é que levanta sempre um erro.

NB: o código abaixo é extraído de um procedimento armazenado executado pela actualização, inserção e supressão de gatilhos na tabela WorkLog. @PersonID é um dos parâmetros dessa tabela. O procedimento arquivado funciona bem se eu comentar a segunda parte desta Declaração.

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
Author: Ryan Kirkman, 2009-07-24

1 answers

Já verificou que existe de facto uma linha onde Staff_Id = @PersonID? O que você postou funciona bem em um script de teste, assumindo que a linha existe. Se você comentar a instrução inserir, então o erro é levantado.

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
 38
Author: Rick, 2009-07-24 00:56:17