簡體   English   中英

SQL Server IF NOT EXISTS 用法?

[英]SQL Server IF NOT EXISTS Usage?

好的,所以我的架構是這樣的:

表:Timesheet_Hours

列:

  • Timesheet_Id (PK, int)
  • Staff_Id (int)
  • 預訂時間(整數)
  • Posted_Flag(布爾值)

這是該表的極其簡化的版本,但將用於本說明的目的。 假設一個人只能有一個時間表記錄。

我想要做的是將記錄添加到另一個名為 WorkLog 的表中。 這里的每條記錄都有一個與之相關的時間。 當該表更新時,我也想更新 Timesheet_Hours。

在我更新 Timesheet_Hours 之前,我想首先檢查相關的 Timesheets 是否尚未發布,然后我想首先檢查是否確實有要更新的記錄。

if 語句的第一部分用於檢查時間表是否尚未發布,工作正常。 問題是第二部分。 它正在檢查要更新的記錄是否已經存在。 問題是它總是會引發錯誤。

注意:下面的代碼是從 WorkLog 表上的更新、插入和刪除觸發器運行的存儲過程中提取的。 @PersonID 是該表的參數之一。 如果我注釋掉該語句的第二部分,存儲過程就可以正常工作。

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

您是否驗證過實際上有一行 Staff_Id = @PersonID? 假設該行存在,您發布的內容在測試腳本中運行良好。 如果注釋掉插入語句,則會引發錯誤。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM