如何为多行更新编写触发器?

时间:2012-02-29 04:59:15

标签: sql sql-server sql-server-2008 tsql triggers

我编写了一个更新触发器,当我只更新一行但在更新多行时出错时,它可以正常工作。

错误:

  

消息512,级别16,状态1,过程Sale_OnUpdate,第14行子查询返回的值超过1。   当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

这是触发器

ALTER  TRIGGER [dbo].[Sale_OnUpdate]    ON  [dbo].[Sale] 
   AFTER Update

AS 
Declare @ID as decimal
Declare @User as varchar(250)
Declare @Status as varchar(250)

set @ID = (Select ID from Inserted)
set @User = (Select UpdatedByUser from Inserted)
set @Status = Isnull((Select Status from Inserted),'')

BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

   INSERT INTO [dbo].[Log]
           (
           [RecordID]
           ,[Date]
           ,[Time]
           ,[UserName]
           ,[TableName]
           ,[Action]
           )
     VALUES
           (
           @ID
           ,GetDate()
           ,GetDate()
           ,@User
           ,'Sale'
           ,'Update,' + @Status
           )
END

我应该做些什么改变才能使它适用于多行。

4 个答案:

答案 0 :(得分:1)

ALTER  TRIGGER [dbo].[Sale_OnUpdate]    ON  [dbo].[Sale] 
   AFTER Update
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

   INSERT INTO [dbo].[Log]
           (
           [RecordID]
           ,[Date]
           ,[Time]
           ,[UserName]
           ,[TableName]
           ,[Action]
           )
     SELECT
           ID
           ,GetDate()
           ,GetDate()
           ,UpdatedByUser
           ,'Sale'
           ,'Update,' + Isnull(Status,'')
     from Inserted
END

答案 1 :(得分:1)

试试这个

ALTER TRIGGER [dbo].[Sale_OnUpdate] ON [dbo].[Sale] 
  AFTER Update

AS 
as 
if update (qty) 


BEGIN
  -- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.
  SET NOCOUNT ON;
/* check value of @@rowcount */ 
    if @@rowcount = 1 

  INSERT INTO [dbo].[Log]
    ([RecordID]
   , [Date]
   , [Time]
   , [UserName]
   , [TableName]
   , [Action])
  SELECT id,
         GETDATE(),
         GETDATE(),
         updatedbyuser,
         'Sale',
         'Update,' + ISNULL(status, '')

    else
    /* when rowcount is greater than 1, 
       use a group by clause */ 
    begin 
    INSERT INTO [dbo].[Log]
    ([RecordID]
   , [Date]
   , [Time]
   , [UserName]
   , [TableName]
   , [Action])
  SELECT i.id,
         GETDATE(),
         GETDATE(),
         i.updatedbyuser,
         'Sale',
         'Update,' + ISNULL(i.status, '')
    FROM INSERTED i
    and inserted.title_id = deleted.title_id
   end

END

答案 2 :(得分:0)

使用:

ALTER TRIGGER [dbo].[Sale_OnUpdate] ON [dbo].[Sale] 
  AFTER Update

AS 

BEGIN
  -- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.
  SET NOCOUNT ON;

  INSERT INTO [dbo].[Log]
    ([RecordID]
   , [Date]
   , [Time]
   , [UserName]
   , [TableName]
   , [Action])
  SELECT i.id,
         GETDATE(),
         GETDATE(),
         i.updatedbyuser,
         'Sale',
         'Update,' + ISNULL(i.status, '')
    FROM INSERTED i

END

答案 3 :(得分:0)

我遇到了类似的问题,这里的想法是INSERTED表有很多记录,所以如果你想分析每个值,你需要通过示例使用游标迭代表:

Loop through INSERTED table