2013-05-09 74 views
-1

为什么此触发器不起作用?我尝试创建从datetime插入单个日期的触发器。如何创建触发器以将日期时间拆分为日期

例子是这样的:

当我插入日期时间,触发将插入日期,月份,年份,DAYNAME,年龄在另一列。

日期时间,日期月份,年份,日期,年龄在同一个表中。

╔══════════════════════════════╦══════╦═══════╦══════╦═════════╦══════════╗ 
    ║   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' 的对象在数据库中。

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

+3

** **如果是有意义的分解像这样的日期,使用[计算列](http://msdn.microsoft.com/zh-CN/library/ms191250(v = sql.105).aspx)而不是使用触发器似乎更明智。 – 2013-05-09 14:33:42

+3

与此同时,您的触发器无论如何都会被中断,因为它假定“插入”中只有一行。这通常不正确。 'inserted'可以包含0,1行或多行。 – 2013-05-09 14:34:59

+0

我只想尝试。那。我不能吗? – oebanez 2013-05-09 14:44:40

回答

3

首先:它会更容易只是定义计算列,这和让SQL Server的手柄更新为那些需要自动:

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

等。

其次,如果你使用触发器坚持 - 然后是前手MUST创建列!否则,您将尝试重复创建相同的列 - 因此会出现错误。另外:当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 
+1

谢谢,最后它有可能,我尝试了一些方法,但这个真的有效:) – oebanez 2013-05-09 16:22:07

+0

我确定计算列存在于2000年版本。如果你想强调为什么需要2005年的一些原因(例如,g'PERSISTED')请这样做(尽管我同意不支持古代版本的一般精神) – 2013-05-09 17:36:25

相关问题