-1

为什么这个触发器不起作用?我尝试创建从日期时间插入单个日期的触发器。

像这样的例子:

当我插入日期时间时,触发器将在其他列中插入日期、月份、年份、日期名称、年龄。

日期时间、日期月份、年份、日期名称、年龄在同一张表中。

  ╔══════════════════════════════╦══════╦═══════╦══════╦═════════╦══════════╗
  ║           DateTime           ║ DATE ║ MONTH ║ YEAR ║ DAYNAME ║ Age      ║
  ╠══════════════════════════════╬══════╬═══════╬══════╬═════════╬══════════╣
  ║ April, 06 1982 00:00:00+0000 ║    4 ║     6 ║ 1982 ║ Friday  ║       31 ║
  ╚══════════════════════════════╩══════╩═══════╩══════╩═════════╩══════════╝

CREATE TRIGGER tgl
    ON penduduk
    FOR INSERT
    AS
    DECLARE
    @myDate CHAR(11)
    SELECT @myDate=tgl_lahir FROM inserted
    INSERT INTO penduduk(tgl) VALUES (datename(day,@myDate))

当我尝试上面的代码时,我收到了消息

消息 2714,级别 16,状态 2,过程 tgl,第 8 行
数据库中已经有一个名为“tgl”的对象。

我应该在创建触发器之前创建列日期、月份、年份和年龄吗?

4

1 回答 1

3

首先:为此定义计算列并让 SQL Server 根据需要自动处理更新会容易得多:

ALTER TABLE dbo.penduduk
   ADD DateYear AS YEAR(DateTimeColumn) PERSISTED,
       DateMonth AS MONTH(DateTimeColumn) PERSISTED,
       DateDay AS DAY(DateTimeColumn) PERSISTED

等等。

其次,如果您坚持使用触发器 - 那么的,您必须事先创建列!否则,您将尝试一遍又一遍地创建相同的列 - 因此会出现错误。另外:更新后你会做什么DateTimeColumn?为此,您可能需要第二个触发器....

另外:您需要注意,SQL Server 中的触发器每条语句运行一次- 而不是每行一次!您的Inserted伪表可以包含多行,因此您需要相应地编码!不要只从表中选择一个值 - 毕竟,该表中可能有 100 行!你会从哪一行中选择?

在您的应用程序首次运行之前在表中创建列:

ALTER TABLE dbo.penduduk
   ADD DateDay INT, DateMonth INT, DateYear INT   etc.

然后创建一个类似这样的触发器:

CREATE TRIGGER tgl ON dbo.penduduk
FOR INSERT
AS
    UPDATE dbo.penduduk
    SET DateDay = DAY(i.DateTimeColumn),
        DateMonth = MONTH(i.DateTimeColumn),
        DateYear = YEAR(i.DateTimeColumn)
    FROM Inserted i
    WHERE i.PrimaryKeyColumn = dbo.penduduk.PrimaryKeyColumn
于 2013-05-09T15:00:04.083 回答