2013-05-09 46 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

相關問題