【发布时间】:2018-09-29 17:57:18
【问题描述】:
感谢收看。我正在尝试编写一个 SQL Server 触发器,当添加包含日期信息的新记录时,会将星期几添加到 DayOfWeek 列。这是我的表格,列按顺序排列:
食物表:
FoodName **varchar(20)**
CategoryID (FK) **int**
Price **smallmoney**
StoreID (FK) **int**
Date **datetime**
DayOfWeek **varchar(9)**
ShopperID (FK) **int**
Week **int**
这是我写的触发器:
-- Create a trigger to update day of the week when a record is inserted
CREATE TRIGGER DOW
ON Food
FOR INSERT
AS
BEGIN
-- Declare a variable to hold the date ID
DECLARE @dateID DATETIME
-- Get the date from the new record and store it in @dateID
SELECT @dateID = Date FROM Food
-- Insert day of the week based on the inserted date
INSERT INTO Food (DayOfWeek)
SELECT DATENAME(dw, @dateID)
END
GO
SQL Server 似乎接受了这个过程,但是当我运行另一个过程来插入新记录时,我得到了这个错误:
消息 515,级别 16,状态 2,过程 DOW,第 8 行 [批处理开始第 21 行]
无法将值 NULL 插入“周”列、表 *******;列不允许空值。插入失败。
我不确定为什么这个触发器会影响“周”列。代码应采用为 Date 输入的值并使用 DATENAME(dw,...) 函数返回星期几,该日期应进入 DayOfWeek 列。我写了一个存储过程,它接受一个日期作为输入,并将相应的星期几插入到记录中,它工作得很好,但是这个触发器似乎不想合作。我被难住了!
【问题讨论】:
-
food.week似乎是声明NOT NULL。当您插入food而不指定week的值时,您在触发器中执行此操作,这会导致错误或您实际遇到的错误。 -
dayofweek可能还有weektoo,如果这是日历周数,则全部取决于我猜的日期,因此根本不应该在该表中。或者,如果您坚持将它们放在表中,您可能希望查看计算列,而不是使用触发器。 -
除 DayOfWeek 之外的所有列都不为 NULL。问题是,当我运行我的 INSERT 过程时,为每一列提供了一个值,除了 DayOfWeek,它应该从这个触发器中获取它的值。 Week 列根本不受此触发器的影响。
-
你的表的主键是什么?
标签: sql-server triggers sql-insert