-1

このトリガーが機能しないのはなぜですか? datetime から単一の日付を挿入するトリガーを作成しようとしています。

このような例:

日時を挿入すると、トリガーは日付、月、年、曜日、年齢を他の列に挿入します。

datetime、date month、year、dayname、age は同じテーブルにあります。

  ╔══════════════════════════════╦══════╦═══════╦══════╦═════════╦══════════╗
  ║           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また:が更新されたらどうしますか? そのためにはおそらく2番目のトリガーが必要になるでしょう....

また、SQL Server のトリガーは、行ごとではなく、ステートメントごとに 1 回実行されることに注意する必要があります。擬似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 に答える