我正在將我的數據庫從太平洋時間的存儲日期時間過渡到UTC,但不會同時更改所有代碼。SQL觸發器觸發但未插入原始值
我想寫一個觸發器,將更新在任一列中輸入的時間,並將它們轉換並插入到另一列中。
Ex。如果我在OriginalTime列中插入太平洋時間,它應該將時間轉換爲UTC並使用UTC時間更新NewTime列。相反,如果我在NewTime中插入/更新值,它應該將時間轉換回太平洋並將其放入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 |
+-----------------+--------------------------+
一個光標和一個觸發器......我的眼睛,我的眼睛......他們燃燒。我試圖用單個更新和一個case語句來重寫它,使其基於set。 – RThomas
哈哈我已經看到了很多情緒,但沒有太多的支持。 (並不是說沒有)因爲每次添加/修改記錄時都需要觸發,是不是合適的觸發器?就遊標/集合辯論而言,你是否有任何資源方便地顯示如何將其轉換爲基於集合的模型? – jstim