Sql server SqlServer触发器以添加多行

Sql server SqlServer触发器以添加多行,sql-server,triggers,Sql Server,Triggers,我有以下触发因素: ALTER TRIGGER .[dbo].[trgAfterInsertComment] ON .[dbo].[Comment] AFTER INSERT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; declare @Id in

我有以下触发因素:

ALTER TRIGGER .[dbo].[trgAfterInsertComment] 
   ON  .[dbo].[Comment] 
   AFTER INSERT
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    declare @Id int;
    declare @LoanId int;
    declare @CopyId int;
    declare @CustomerId int;
    declare @Comment nvarchar(255);

    --DECLARE cur CURSOR FOR 
    select @Id = Id from inserted
    select @LoanId = LoanId from inserted
    --select @CopyId = CopyId from deleted
    --select @CustomerId = CustomerId from deleted
    select @Comment = Comment from inserted
    -- OPEN cur

    --FETCH NEXT FROM cur INTO @Id, @ISBN, @Purchase_Date

    --WHILE @@FETCH_STATUS = 0 BEGIN

        -- your business logic 
    Declare @Title nvarchar(255);
    select @Title = (Select Title from Book where ISBN = (select ISBN from copy where Id = (select CopyId from Loan where Id = @LoanId)))
    select @CustomerId = (Select CustomerId from Loan where Id = @LoanId)
    select @CopyId = (Select CopyId from Loan where Id = @LoanId)
    insert into Activity("Heading", "Date")

    values(Concat('New Comment added - Id: ', @Id, ' Title: ', @Title, ' Copy Id: ', @CopyId, ' Customer Id: ', @CustomerId, ' Comment: ', @Comment), GETDATE())

        --FETCH NEXT FROM cur INTO @Id, @ISBN, @Purchase_Date

    --END

    --CLOSE cur
    --DEALLOCATE cur
    end
正如您所看到的,我已经注释掉了一个游标,该游标用于处理多个插入。有没有人能告诉我,在没有光标的情况下如何处理多个插入,因为在阅读之后,我发现使用光标是个坏主意

使用上述触发器,如果我尝试像这样插入多行:

USE [Library]
GO

INSERT INTO [dbo].[Comment]
           ([LoanId]
           ,[Comment])
     VALUES
           (47, 'test'),
           (48, 'test'),
           (50, 'test')
GO

只有第一行插入到我的活动表中。感谢您的帮助

直接查询插入的表

insert into [dbo].[Comment] (LoanId, Comment)
select LoanId, Comment from inserted

您可以将select查询更改为更复杂的查询,以便仅使用查询获得结果。

直接查询插入的表

insert into [dbo].[Comment] (LoanId, Comment)
select LoanId, Comment from inserted

您可以将select查询更改为更复杂的查询,以便仅使用查询来实现结果。

您需要将其转换为基于设置,使用变量和循环将导致问题。无法测试以下内容,但类似于:

INSERT INTO Activity
        (   
            Heading , 
            [Date]
        )
SELECT      CONCAT('New Comment added - Id: ', I.id, ' Title: ', COALESCE(B.Title,''), ' Copy Id: ', COALESCE(L.CopyID,''), ' Customer Id: ', COALESCE(L.CustomerID,''))    ,
            GETDATE()
FROM        inserted    AS  I
LEFT JOIN   Loan        AS  L   ON  I.loanId    =   L.loanId
LEFT JOIN   Copy        AS  C   ON  C.Id        =   L.CopyId
LEFT JOIN   Book        AS  B   ON  B.ISBN      =   C.ISBN;

您需要将其转换为基于集合的,使用变量和循环会导致问题。无法测试以下内容,但类似于:

INSERT INTO Activity
        (   
            Heading , 
            [Date]
        )
SELECT      CONCAT('New Comment added - Id: ', I.id, ' Title: ', COALESCE(B.Title,''), ' Copy Id: ', COALESCE(L.CopyID,''), ' Customer Id: ', COALESCE(L.CustomerID,''))    ,
            GETDATE()
FROM        inserted    AS  I
LEFT JOIN   Loan        AS  L   ON  I.loanId    =   L.loanId
LEFT JOIN   Copy        AS  C   ON  C.Id        =   L.CopyId
LEFT JOIN   Book        AS  B   ON  B.ISBN      =   C.ISBN;

“插入第一行”-您甚至不能保证这一点。因为您正在运行独立选择来填充变量,所以不能保证它们都对应于插入的
中的同一行。Damien,有没有关于如何做得不同的建议?“插入第一行”-您甚至不能保证这一点。因为您正在运行独立选择来填充变量,所以不能保证它们都对应于插入的
中的同一行。Damien,有没有关于如何进行不同操作的建议?嗨,Arkadiusz,谢谢您的帖子。但对于插入的每一行,我想向活动表中添加一行。我不确定你的答案是否符合这一点?@DevDave确实如此,SQL server是成套工作的。如果您是从编程的角度考虑问题,那么您会考虑将foreach循环添加到表中,但是SQL不需要这样工作。如果将INSERT与SELECT一起使用,则将为SELECT返回的每一行插入一行。这是使用SQL的方法,循环和游标有一定的位置,但应该避免在它们可能的位置。嗨,Arkadiusz,谢谢你的帖子。但对于插入的每一行,我想向活动表中添加一行。我不确定你的答案是否符合这一点?@DevDave确实如此,SQL server是成套工作的。如果您是从编程的角度考虑问题,那么您会考虑将foreach循环添加到表中,但是SQL不需要这样工作。如果将INSERT与SELECT一起使用,则将为SELECT返回的每一行插入一行。这是使用SQL的方法,循环和游标有一定的位置,但应该避免使用它们。