2016-11-14 109 views
0

我有一張表格,它具有以下列,並且我無法修改架構(即,我無法修改表格或添加標識字段)。插入後觸發器

我想要的是創建一個觸發器來更新一列以將其視爲一個標識字段。

accountno  firstname lastname  keyField 
jku45555  John   Doe   123 

現在我想的是,當我將下一紀錄,我搶了此前的紀錄的KeyFieldId和更新新插入的記錄是124(記住這個Varchar場)。

我需要這樣做的最佳方式,就像我說的修改表不是一個選項。謝謝!

+0

爲什麼你不好奇添加標識列? –

+1

我確切地知道你在說什麼,但這是一個API,我無法控制我們過去做過這些,但現在我升級到更新的版本,每個定製的字段都將被刪除,唯一的辦法就是隻是使用我提到的一個字段,因爲我們已經將數據從該定製的標識字段移動到這個字段,現在我需要的是更新該字段。 PmbAustin實際上提出了一個直接的例子。但是我的雙手被綁住了。 –

回答

2

你想要做這樣的事情......對於一個名爲「foo」的表,有兩列,名字和KeyFieldId(均爲VARCHAR),這觸發會做你想要什麼:

------------------------------------------------------------------------- 
-- These lines will create a test table and test data 
--DEBUG: CREATE TABLE Foo (FirstName varchar(20), KeyFieldId varchar(10)) 
--DEBUG: INSERT INTO Foo VALUES ('MyName', '145') 
--  
CREATE TRIGGER test_Trigger ON Foo 
INSTEAD OF INSERT 
AS 
BEGIN 
    DECLARE @maxKeyFieldId int; 
    SELECT @maxKeyFieldId = MAX(CAST(KeyFieldId AS int)) FROM Foo; 
    WITH RowsToInsert AS (
     SELECT *, ROW_NUMBER() OVER (ORDER BY (CAST(KeyFieldId AS int))) AS RowNum 
     FROM inserted 
    ) INSERT INTO Foo (FirstName, KeyFieldId) 
     SELECT FirstName, @maxKeyFieldId + RowNum 
      FROM RowsToInsert; 

END 

需要注意的事項在這裏:

  1. 創建INSTEAD OF INSERT觸發器
  2. 找到你KeyFieldID
  3. 的整數值的「最大」價值創造的CTE選擇一切˚F ROM中的「插入」收集
  4. 添加列的CTE的行號
  5. 做實際的INSERT通過添加行號到最大KeyFieldID
+0

謝謝,你只是把我放在正確的軌道上,我不應該做一個更新,因爲記錄是從CRM插入,現在我需要的是更新KEYFIELD到maxkeyfieldid + RowNum –

+0

INSTEAD OF INSERT觸發器運行*而不是*插入,所以代碼應該做一個插入。在插入後運行INSERT,並且在那裏執行更新,但在這種情況下,避免必須執行插入並轉向並立即執行更新似乎更有效率......只需插入正確的數據即可開始。 – pmbAustin