0

データベースを太平洋時間の日時の保存から UTC に移行していますが、すべてのコードを同時に変更するつもりはありません。

いずれかの列に入力された時間を更新し、それらを変換して他の列に挿入するトリガーを作成しようとしています。

元。OriginalTime 列に太平洋時間を挿入すると、時刻が UTC に変換され、NewTime 列が UTC の時刻で更新されます。逆に、NewTime の値を挿入/更新すると、時刻が Pacific に戻され、OriginalTime に挿入されます。

私は物事を間違ってループしていますか?

ALTER TRIGGER tr_Calls_CreateDate ON Calls
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON

DECLARE
    @CallId INT,
    @CreateDate DATETIME,
    @CreateDateUTC DATETIME

--Create cursor
DECLARE CreateDate_Cursor CURSOR LOCAL FOR
    SELECT CallId, CreateDate, CreateDateUTC FROM Inserted

OPEN CreateDate_Cursor;

-- Get First Row
FETCH NEXT FROM CreateDate_Cursor INTO @CallId, @CreateDate, @CreateDateUTC;

WHILE @@FETCH_STATUS = 0
BEGIN
    IF UPDATE ([CreateDate])
    BEGIN
        UPDATE Calls
        SET CreateDateUTC = dbo.ConvertPacificTimeToUTC(@CreateDate)
        WHERE CallId = @CallId
    END

    IF UPDATE ([CreateDateUTC])
    BEGIN
        UPDATE Calls
        SET CreateDate = dbo.ConvertUTCTimeToPacific(@CreateDateUTC)
        WHERE CallId = @CallId
    END

    FETCH NEXT FROM CreateDate_Cursor INTO @CallId, @CreateDate, @CreateDateUTC;
END

-- Free Up Cursor
CLOSE CreateDate_Cursor;
DEALLOCATE CreateDate_Cursor;
END

何らかの理由で、現在のトリガーは変換された値を正しく入力していますが、トリガーを起動させた挿入が失敗しているようです。

値を挿入すると:

INSERT INTO Calls (CreateDate)
VALUES (GETDATE()) -- getdate currently outputs in pacific time

トリガーの結果は得られますが、挿入された値は得られません。

+-----------------+--------------------------+
|   CreateDate    |      CreateDateUTC       |
+-----------------+--------------------------+
|       NULL      | 2013-01-24 20:27:13.510  |
+-----------------+--------------------------+
4

1 に答える 1

5

挿入UPDATE(column)では、すべての列に当てはまります。これは、2回目の更新でCreateDate列にnullが書き込まれるときです。

したがって、2つのトリガーを作成する必要があります。1つはコードのように更新を処理し、もう1つは挿入を処理します。CreateDateのみが評価されている場合、CreateDateUTCはNULLであり、それを確認できます。

また、これには実際にはカーソルを使用しないでください。代わりに次のようなものを使用してください。

UPDATE c SET
  CreateDate = ISNULL(CreateDate, dbo.ConvertUTCTimeToPacific(i.CreateDateUTC)),
  CreateDateUTC = ISNULL(CreateDateUTC, dbo.ConvertPacificTimeToUTC(i.CreateDate))
FROM dbo.Calls AS c
JOIN INSERTED AS i
ON i.CallId = c.CallId;

つまり、挿入トリガーの場合です。UPDATEの場合、次のようなものを使用できます。

UPDATE c SET
  CreateDate = CASE WHEN UPDATE ([CreateDateUTC]) THEN CreateDate
                  ELSE dbo.ConvertUTCTimeToPacific(i.CreateDateUTC)
               END,
  CreateDateUTC = CASE WHEN UPDATE ([CreateDate]) THEN CreateDateUTC
                    ELSE dbo.ConvertPacificTimeToUTC(i.CreateDate)
                  END
FROM dbo.Calls AS c
JOIN INSERTED AS i
ON i.CallId = c.CallId;

これはすべてテストされていないコードですが、機能するはずです。


編集:なぜこれをステートメントUPDATE内にラップする必要があるのか​​については、以下の私の長いコメントを参照してください。IF

于 2013-01-24T23:10:24.897 に答える