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的方法,循环和游标有一定的位置,但应该避免使用它们。