插入后触发

Triggers after insert

我有一个包含以下列的 table,我无法修改架构(即我无法修改 table 或添加身份字段)。

我想要的是创建一个触发器来更新一列以将其视为标识字段。

accountno      firstname    lastname      keyField
jku45555       John          Doe          123

现在我想要的是当我插入下一条记录时,我抓取前一条记录的 KeyFieldId 并将新插入的记录更新为 124(记住这是一个 Varchar 字段).

我需要最好的方法来做到这一点,就像我说的那样修改 table 不是一个选项。谢谢!

您想做这样的事情...对于名为 "Foo" 的 table,有两列,First Name 和 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 的 INTEGER 值的 "max" 值
  3. 创建一个从 'inserted' 集合中选择所有内容的 CTE
  4. 为行号向 CTE 添加一列
  5. 通过将行号添加到最大 KeyFieldID 来执行实际的 INSERT