SQL Server 2008之前插入触发器

3

我有以下查询:

Insert into tblTest (ID, Name, Age) VALUES (1, 'TestName', 20);

在我的触发器中,我希望检查-如果查询的ID等于1,则发送另一个查询:

Insert into tblTest (ID, Name, Age) VALUES (2, 'TestName', 21);

否则,什么都不做。
问题是,我不知道如何保持参数不变,只改变年龄,因此基本上我想发送相同的查询,并更改某个参数(在这种情况下,它是年龄参数)。
1个回答

3
即将插入的行可以在特殊的inserted表中找到。以下是一个示例:
if object_id('tblTest') is not null 
    drop table tblTest
create table tblTest (id int, name varchar(50), age int)
go
create trigger trg_tblTest_BeforeInsert
on tblTest
after insert
as begin
    insert  tblTest
    select  id + 1
    ,       name
    ,       age + 1
    from    inserted
    where   id = 1 -- Only for rows with id=1
end
go
insert tblTest (id, name, age) values (1, 'TestName', 20)
select * from dbo.tblTest

这将打印:

id  name      age
1   TestName  20
2   TestName  21

谢谢,但是如果我的表格不同,例如一个有20列的表格,我需要更改1列并插入它,我应该逐个编写所有列吗? - m0fo
最好写出所有的列。为了节省打字时间,在SSMS中右键单击表,选择“Script As -> Select”。这将生成一个基本的列列表。 - Andomar
好的,关于:insert tblTest (id, name, age) values (1, 'TestName', 20),有没有办法只运行用户的查询而不是硬编码写入?比如,如果用户发送了其他细节而不是1、'TestName'、20。如果我根本不写它,它会发送吗? - m0fo
“insert ... values ...” 这一行只是一个测试用例。触发器适用于影响表的任何查询。 - Andomar
是否可以仅在ID = 1时运行触发器?如果可以,我应该将此条件放在哪里? - m0fo
触发器将始终执行,但您可以在触发器内部添加条件。我已编辑答案并包含一个示例条件。 - Andomar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接