Как написать триггер для многострочного обновления? - PullRequest
0 голосов
/ 29 февраля 2012

Я написал триггер обновления, который прекрасно работает, когда я обновляю только одну строку, но выдает ошибку, когда я обновил несколько строк.

Ошибка:

Сообщение 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 ]

1 голос
/ 29 февраля 2012
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 голос
/ 29 февраля 2012

попробуйте

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 голосов
/ 08 октября 2016

У меня была похожая проблема, идея в том, что таблица INSERTED имеет много записей, поэтому, если вы хотите проанализировать каждое значение, вам нужно будет выполнить итерацию таблицы с помощью курсора на примере:

Цикл по вставленной таблице

0 голосов
/ 29 февраля 2012

Использование:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...