0

我有一个表,我需要使用插入记录的标识来更新列的值。

以下是我写的触发器:

CREATE TRIGGER [dbo].[UpdateRecordID]
on [dbo].[Employee]
AFTER INSERT
AS 
BEGIN   
    UPDATE dbo.Employee
    SET RecordID = (SELECT EmployeeID FROM INSERTED ) WHERE EmployeeID= (SELECT EmployeeID FROM INSERTED )
END

触发器已成功创建,但是当我将记录插入表中时,出现以下错误:

超出最大存储过程、函数、触发器或视图嵌套级别(限制 32)。

如果我不将 where 条件放在更新语句中并将触发器编写如下:

ALTER TRIGGER [dbo].[UpdateRecordID]
on [dbo].[Employee]
AFTER INSERT
AS 
BEGIN   
    UPDATE dbo.Employee
    SET RecordID = (SELECT EmployeeID FROM INSERTED )
END

我收到以下错误:

子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。该语句已终止。

更新记录以将主键保留在另一列中以便我可以在同一个表中添加更多记录并使它们保持相关的最佳做法是什么?

我可以在使用@@Identity 插入记录的存储过程中编写更新语句,但我想使用触发器来做同样的事情。

4

2 回答 2

3

您应该在 INSERTED 表上加入您的表,因为它可以包含更多行。

CREATE TRIGGER [dbo].[UpdateRecordID]
on [dbo].[Employee]
AFTER INSERT
AS 
BEGIN   
    UPDATE e
    SET RecordID = i.EmployeeID 
    FROM dbo.Employee e
    INNER JOIN INSERTED i on i.EmployeeID = e.EmployeeID
END
于 2013-10-07T15:05:41.470 回答
0

更新记录以将主键保留在另一列中以便我可以在同一个表中添加更多记录并使它们保持相关的最佳做法是什么?

我认为你正在寻找代表一个层次结构。通常,对于没有父级的行,保存关系的列将为空,而不是将它们自己的 PK 复制到其中。

一个例子:

create table Items (
      ID int not null primary key identity(1, 1)
    , Name varchar(50) not null unique
    , ParentID int null references Items (ID)
);
insert into Items (Name, ParentID) select 'Parent', null;
insert into Items (Name, ParentID) select 'Child', ID from Items where Name = 'Parent';

请注意,我们不需要触发器,插入子记录非常容易。

还有其他方法可以在 SQL 中表示层次结构,包括 SQL Server 自己的HierarchyID

至于您的错误消息,这些可能表明您发生了一些触发递归。检查嵌套和递归触发器的值。

于 2013-10-07T15:11:48.073 回答