SQL Server IF NOT EXISTS 用法?

标签 sql sql-server stored-procedures

好的,所以我的架构是这样的:

表:Timesheet_Hours

列:

  • Timesheet_Id(PK,整数)
  • Staff_Id(整数)
  • 预订时间(整数)
  • Posted_Flag( bool 值)

这是该表的极其简化的版本,但它将用于本说明的目的。假设一个人只能有一个时间表记录。

我想要做的是将记录添加到另一个名为 WorkLog 的表中。这里的每条记录都有一个与之关联的时间。当该表更新时,我也想更新 Timesheet_Hours。

在更新 Timesheet_Hours 之前,我想首先检查相关时间表是否尚未发布,然后我想首先检查是否确实有要更新的记录。

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

关于SQL Server IF NOT EXISTS 用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1175217/

相关文章:

sql - 触发创建父元素并在 postgresql 中检索 id

Sql强制转换为没有科学计数法的 float

sql - where 子句中存在大量参数

PHP MySQL PDO 绑定(bind)输入/输出相同参数

sql - SSRS查询分页

sql - LTRIM/RTRIM - 但只有第一个/最后一个字符是空格时?

sql - 将一些列转置为行

sql-server - 使用 sp_send_dbmail() 发送电子邮件有时不起作用

c# - Entity Framework Code First 是否支持存储过程?

mysql - 将 SQL Server 存储过程重写为 MySQL(MariaDB)