插入后触发
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
这里需要注意的事项:
- 创建一个 INSTEAD OF INSERT 触发器
- 找到您的 KeyFieldID 的 INTEGER 值的 "max" 值
- 创建一个从 'inserted' 集合中选择所有内容的 CTE
- 为行号向 CTE 添加一列
- 通过将行号添加到最大 KeyFieldID 来执行实际的 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
这里需要注意的事项:
- 创建一个 INSTEAD OF INSERT 触发器
- 找到您的 KeyFieldID 的 INTEGER 值的 "max" 值
- 创建一个从 'inserted' 集合中选择所有内容的 CTE
- 为行号向 CTE 添加一列
- 通过将行号添加到最大 KeyFieldID 来执行实际的 INSERT