Sql 找到原始记录并仅更改该记录,而不是插入的记录

Sql 找到原始记录并仅更改该记录,而不是插入的记录,sql,sql-server-2005,join,triggers,Sql,Sql Server 2005,Join,Triggers,我已经试过了,但到目前为止还没有成功。由于我在查询方面的知识有限,我想我最好把它贴在这里 我有一张学生表,结构如下 create table students( id int not null primary key identity, sname varchar(25), status varchar(25), renew varchar(15), enrollment datetime, ) 我有许多学生,他们有ID、学生姓名(sname)、状态(“活动”或“不活动”)、续订(“新学生为“

我已经试过了,但到目前为止还没有成功。由于我在查询方面的知识有限,我想我最好把它贴在这里

我有一张学生表,结构如下

create table students(
id int not null primary key identity,
sname varchar(25),
status varchar(25),
renew varchar(15),
enrollment datetime,
)
我有许多学生,他们有ID、学生姓名(sname)、状态(“活动”或“不活动”)、续订(“新学生为“否”,续订学生为“是”)和注册日期

insert into students values('jay','active','no','2010-01-01')
insert into students values('Phil','active','no','2010-01-01')
insert into students values('Cru','active','no','2010-01-01')
insert into students values('slow','active','no','2010-01-01')
insert into students values('true','active','no','2010-01-01')
insert into students values('false','active','no','2010-01-01')
现在我有了一个INSERT触发器,当一个学生被更新时,它会使一个老学生停止活动。因此,如果我插入以下更新设置为“是”的内容,则应使已存在的记录处于“非活动”状态

insert into students values('false','active','yes','2011-01-01')
我编写了这个插入触发器,它可以工作,但它同时激活了旧的和新的插入记录。我只想取消激活原始记录。另外,不仅注册日期和nenew字段不同,原始记录和插入记录之间的其余字段相同。如何解决这个问题?这是我的扳机

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[tr_renew_student]
ON [dbo].students
-- WITH ENCRYPTION
FOR INSERT
-- WITH APPEND
-- NOT FOR REPLICATION
AS
-- insert sql here
if exists(select * from inserted where Renew = 'yes')
BEGIN

UPDATE students 
    SET status = 'Inactive'

    FROM Inserted i
        INNER JOIN students T2
            ON i.sname = T2.sname

END
请注意,这与我的问题非常接近。非常感谢。
将您的更新更改为:

UPDATE students 
    SET status = 'Inactive'

    FROM Inserted i
        INNER JOIN students T2
            ON i.sname = T2.sname
            AND i.id <> t2.id
更新学生
设置状态='Inactive'
从插入i
内部连接学生T2
在i.sname=T2.sname上
和i.id t2.id

这将检查您正在更新的行是否不是新插入的行。

将您的更新更改为:

UPDATE students 
    SET status = 'Inactive'

    FROM Inserted i
        INNER JOIN students T2
            ON i.sname = T2.sname
            AND i.id <> t2.id
更新学生
设置状态='Inactive'
从插入i
内部连接学生T2
在i.sname=T2.sname上
和i.id t2.id

这将检查您正在更新的行是否不是新插入的行。

是否查看了@@identity?几年前,我处理过类似的事情,并使用@identity获取最后创建的identity值;基本上是获取最新的标识值,然后设置所有与条件匹配的记录,除了通过@identity返回ID的记录

在此处阅读有关标识值获取程序的信息:

添加:您对插入的
表的看法是正确的。如果您不想/无法使用插入的表,则触发器可能会如下所示

SELECT @@identity //  <- this gets the last identity value inserted.

UPDATE students
SET status = 'Inactive'
WHERE students.name = (SELECT name FROM students WHERE id = @@identity)
  AND id <> @@identity

选择@@identity/你看过@@identity了吗?几年前,我处理过类似的事情,并使用@identity获取最后创建的identity值;基本上是获取最新的标识值,然后设置所有与条件匹配的记录,除了通过@identity返回ID的记录

在此处阅读有关标识值获取程序的信息:

添加:您对插入的
表的看法是正确的。如果您不想/无法使用插入的表,则触发器可能会如下所示

SELECT @@identity //  <- this gets the last identity value inserted.

UPDATE students
SET status = 'Inactive'
WHERE students.name = (SELECT name FROM students WHERE id = @@identity)
  AND id <> @@identity

SELECT@@identity//问题:它如何确保更新原始记录,而不是插入记录?它成功了way@Thecrocodilehunter-因为您要确保插入时自动生成的
Id
,与新行的
Id
不匹配。这在我的测试示例中正常工作,但在我的实际代码中,情况正好相反。插入表中的行已更新,而不是需要更新的行。然后显示实际代码。如果您没有给出准确的示例,我们应该如何帮助您?当然,这是一个项目,您的解决方案在本示例中有效,但在实际代码中无效。它具有与此处相同的ID字段。我最初的问题是:它不更新插入记录的逻辑是什么?因为似乎没有一个坚定的逻辑。问题:它如何确保更新原始记录,而不是插入记录?它成功了way@Thecrocodilehunter-因为您要确保插入时自动生成的
Id
,与新行的
Id
不匹配。这在我的测试示例中正常工作,但在我的实际代码中,情况正好相反。插入表中的行已更新,而不是需要更新的行。然后显示实际代码。如果您没有给出准确的示例,我们应该如何帮助您?当然,这是一个项目,您的解决方案在本示例中有效,但在实际代码中无效。它具有与此处相同的ID字段。我最初的问题是:它不更新插入记录的逻辑是什么?因为似乎没有一个坚定的逻辑。它可以走任何一条路?我认为最后插入的记录并不能提供解决方案<代码>插入的
表包含了我需要与原始表连接并查找需要修改的实际记录的所有内容。我通常不使用触发器,所以我之前就忘记了插入的内容。请参阅我的更新答案,以了解有关我对方法的想法的更多详细信息。我认为最后插入的记录无法提供解决方案<代码>插入的
表包含了我需要与原始表连接并查找需要修改的实际记录的所有内容。我通常不使用触发器,所以我之前就忘记了插入的内容。请参阅我的更新答案,了解我对方法的想法的更多细节。