好的,我的模式是:

表:时间表_小时

柱:

  • 时间表Id(主键,整数)
  • 职员Id(内部)
  • 预订时间(国际)
  • Posted_标志(布尔值)

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

我要做的是将记录添加到另一个名为WorkLog的表中.这里的每条记录都有一个相关的时间.当表格更新时,我也想更新时间表.

在更新时间表之前,我想先判断相关时间表是否已经发布,然后我想首先判断是否有需要更新的记录.

if语句的第一部分判断时间表是否已经发布,可以正常工作.问题是第二部分.它正在判断要更新的记录是否已经存在.问题是它总是会引发错误.

注意:下面的代码是从WorkLog表上的update、insert和delete触发器运行的存储过程中提取的@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?假设行存在,您发布的内容在测试脚本中可以正常工作.如果注释掉insert语句,则会引发错误.

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相关问答推荐

PostgreSQL:获取每家店铺收入最高的员工

PostgreSQL:如果发现多行具有相似列值,则跳过 Select 行

如何从上一个值减go 值

SQL是否可以计算每年的所有日期变化?

如何使用WSO2将空值传递给我的SQL Server存储过程?

Lag()函数的差异:R与SQL(将R代码转换为SQL)

Access中执行INSERT INTO查询时出现错误消息

如何在PostgreSQL中的一列中添加两个文本?

更新其组的日期字段值小于最大日期减go 天数的记录

如何在presto中映射id与名称

如何从Spark SQL的JSON列中提取动态数量的键值对

当active=1时,是否可以创建id为的唯一索引?

如何将输出转换为二维格式?

如何创建一个递归计数器来查找一个元素有多少父级和子级?

使用ALTER TABLE无法删除列

SQL Server 分区和 Run Case 语句

如何从 2 个 SQLite 表构建嵌套对象?

查找具有相同连接列数据的所有记录

聚合 Athena 中的列

当我按 PK 分组时,该表中的所有列在每个组中都具有相同的值.那么为什么 SQL Server 需要对这些列进行聚合呢?