【发布时间】:2015-06-12 09:09:58
【问题描述】:
我昨天发布了一个问题,这是相关的。我有一张名为 People_Master 的表
CREATE TABLE [dbo].[People_Master](
[ID] [int] IDENTITY(900001,1) NOT NULL,
[Email] [nvarchar](50) NULL,
[FirstName] [nvarchar](50) NULL,
[uac] [int] NULL,
[department] [nvarchar](50) NULL,
CONSTRAINT [PK_People_Master] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
我还创建了另一个名为 People_Delta 的表
CREATE TABLE [dbo].[People_Delta](
[ID] [int] NOT NULL,
[Email] [nvarchar](50) NULL,
[FirstName] [nvarchar](50) NULL,
[uac] [int] NULL,
[Department] [nvarchar](50) NULL,
[change_type] [nvarchar](10) NULL
) ON [PRIMARY]
请注意,我在 People_Delta 中多了一个名为“change_type”的列
现在我正在尝试为 People_Master 编写一个更新触发器,这样当它发生更新时,它应该将整行写入 People_Delta 并将 change_type 设置为“Modify”。
这是我写的触发器(我不擅长 SQL。哈哈!)
CREATE TRIGGER [dbo].[TR_Update]
ON [dbo].[People_Master]
AFTER Update
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
Declare @RowCount int
Declare @ID int
--Create a temp table to hold the inserted data.
Declare @TempTable As Table
(
[ID] [int],
[Email] [nvarchar](50) ,
[FirstName] [nvarchar](50),
[uac] [int] ,
[department] [nvarchar](50)
)
Insert Into @TempTable (ID,Email,FirstName,uac,department)
select
ID,
Email,
FirstName,
uac,
department
from
inserted
select @ID = ID from inserted
--check if the row for this ID doesnt exist already.
Select @RowCount=COUNT(*) from People_Delta where People_Delta.ID = @ID and People_Delta.change_type = 'Modify';
if(@RowCount = 0)
Begin
Insert into People_Delta (ID,Email,FirstName,uac,Department,change_type)
values (@TempTable.ID,@TempTable.Email,@TempTable.FirstName,@TempTable.uac,@TempTable.department,'Modify');
END
END
GO
但是,当我执行此触发器时,我收到以下错误:
Msg 137, Level 16, State 1, Procedure TR_Update, Line 50
Must declare the scalar variable "@TempTable".
Msg 137, Level 16, State 1, Procedure TR_Update, Line 50
Must declare the scalar variable "@TempTable".
Msg 137, Level 16, State 1, Procedure TR_Update, Line 50
Must declare the scalar variable "@TempTable".
Msg 137, Level 16, State 1, Procedure TR_Update, Line 50
Must declare the scalar variable "@TempTable".
Msg 137, Level 16, State 1, Procedure TR_Update, Line 50
Must declare the scalar variable "@TempTable".
我做错了什么?请帮忙! GT。
【问题讨论】:
-
也可能根据我的要求,有没有更好的方法来完成这个?在我看来,上面的问题是,如果我说必须更改我的表设计,例如添加一个新列,我将不得不更改我的触发器定义以将该列也包含在 People_Delta 的更新中。
-
如果您想为您的问题添加更多内容,您可以edit它。您永远不需要直接对自己的问题(或答案)添加评论
-
也许这会有所帮助? stackoverflow.com/questions/20265023/…
标签: sql-server tsql triggers