Sql 处理触发器中的多行(大容量插入)
我进行批量插入,我有一个触发器,可以相应地进行一些检查和插入: 假设我的批量插入有两列hometeamawayteamSql 处理触发器中的多行(大容量插入),sql,sql-server,tsql,Sql,Sql Server,Tsql,我进行批量插入,我有一个触发器,可以相应地进行一些检查和插入: 假设我的批量插入有两列hometeamawayteam HomeTeam AwayTeam Team1 Team3 Team6 Team9 Team3 Team5 我的数据库有两个表,tblTeamsList(Id,TeamName)包含团队,tblPremierLeague(Id,HomeTeam,AwayTeam)是我进行批量插入的。我有一个INSTEAD OF INSE
HomeTeam AwayTeam
Team1 Team3
Team6 Team9
Team3 Team5
我的数据库有两个表,tblTeamsList(Id,TeamName)包含团队,tblPremierLeague(Id,HomeTeam,AwayTeam)是我进行批量插入的。我有一个INSTEAD OF INSERT触发器,它检查主队是否在TBLTEAMSL列表中,如果不在TBLTEAMSL列表中,它会将其插入tblteams中,然后它会检查AwayTeam并执行相同的操作。最后,我想用它们的外键而不是名字将它们插入tblPremierleague。这是我的扳机
instead of INSERT
AS
BEGIN
DECLARE @homeTeamId INT
DECLARE @awayTeamId INT
DECLARE @maxTeamId INT
DECLARE @matchId INT
DECLARE @home nvarchar(100)
DECLARE @away nvarchar(100)
DECLARE cur CURSOR FOR
Select HomeTeam,AwayTeam from inserted
OPEN cur
FETCH NEXT FROM cur INTO @home, @away
--- Check if home team has already been inserted into the table.
SELECT @homeTeamId = -1
SELECT
@homeTeamId = teamId
FROM
[dbo].[tblTeamslist] t
JOIN inserted i
ON t.teamName = @home
IF (@homeTeamId = -1)
BEGIN
INSERT INTO [dbo].[tblTeamslist] (teamname) SELECT i.hometeam FROM inserted i
END
--- Check if away team has already been inserted into the table.
SELECT @maxTeamId = 0
SELECT @maxTeamId = ISNULL(MAX(teamId), 0) from [dbo].[tblTeamslist]
SELECT @awayTeamId = -1
SELECT
@awayTeamId = teamId
FROM
[dbo].[tblTeamslist] t
JOIN inserted i
ON t.teamName = @away
IF (@awayTeamId = -1)
BEGIN
INSERT INTO [dbo].[tblTeamslist] (teamname) SELECT i.awayteam FROM inserted i
END
-- insert a record into the matches table with the home team ID and away team ID.
INSERT INTO [dbo].[tblpremierLeague]
SELECT @homeTeamId, @awayTeamId
FROM inserted i
FETCH NEXT FROM cur INTO @home, @away
END
CLOSE cur
DEALLOCATE cur
上面的触发器无法正常工作,我在tblPremierLeague中得到了300个相同的行,所有行的值都相同,如下所示:
HomeTeam AwayTeam
-1 1
答案是正确的。此外,在tblTeamsList中多次插入同一团队。
如何更正我的触发器,请提供帮助?假设id是
标识
列:
-- Add all of the home teams we haven't heard of before.
insert into dbo.tblTeamsList
select i.HomeTeam
from inserted as i left outer join
tblTeamsList as TL on TL.TeamName = i.HomeName
where TL.Id is NULL
-- Add all of the alien teams we haven't heard of before.
insert into dbo.tblTeamsList
select i.AwayTeam
from inserted as i left outer join
tblTeamsList as TL on TL.TeamName = i.AwayTeam
where TL.Id is NULL
-- Add any **new** pairs to the league.
insert into tblPremierLeague
select H.Id, A.Id
from inserted as i inner join
tblTeamsList as H on H.TeamName = i.HomeTeam inner join
tblTeamsList as A on A.TeamName = i.AwayTeam left outer join
tblPremierLeague as TL on TL.HomeTeam = H.Id and TL.AwayTeam = A.Id
where TL.Id is NULL
请不要通过折磨行(RBAR)来执行此行。使用集合操作
而且许多人不喜欢命名表的匈牙利式假符号tblMumble
。我会用Mumbles