2016-11-14 171 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