2012-02-29 28 views
0

我已經寫了一個更新觸發器,當我更新只有一行,但更新多行時發生錯誤時工作正常。如何爲多行更新寫入觸發器?

錯誤:

Msg 512, Level 16, State 1, Procedure Sale_OnUpdate, Line 14 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

這裏是觸發

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 

我應該做的改變,使之成爲多行工作。

回答

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 
+0

但我想讓這三個字段(ID,用戶,狀態)登錄。 – 2012-02-29 05:10:16

+0

@ MujassirNasir:那不是你的問題。 – 2012-02-29 05:11:03

+0

我試過這個我知道它的作品,但我想寫觸發器來記錄每一個動作。 – 2012-02-29 05:13:00

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 
+0

但我想讓這三個字段(ID,用戶,狀態)登錄。 – 2012-02-29 05:09:31

+0

@MujassirNasir這正是修改後的觸發器所做的事情(除了使用UpdatedByUser而不是User,如您在原始問題中指定的那樣)。仔細檢查SELECT子句。 – 2012-02-29 05:11:58

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 
0

我也有類似的問題,這個想法在這裏是插入的表有許多記錄,所以如果你想要分析的每個值,您將需要通過示例使用遊標迭代表格:

Loop through INSERTED table