0

我有两个数据库表。

  1. tblTeams: PK TeamID,TeamName
  2. tblMatches: PK match id, FK HomeTeam, FK AwayTeam,Score.

我正在使用 SQL Server 2008,并且正在通过向导从.csv文件中导入行。中的列csvhometeam, awayteam, score。因此,在插入之前tblMatches,我想要一个触发器,它可以找到团队的 FK 并插入tblMatches外键而不是名称。

请提供任何帮助。

CREATE TRIGGER tblmatches_BeforeInsert
ON tblmatches
BEFORE INSERT
AS 
BEGIN
    INSERT  tblmatches
    SELECT  teamName
    FROM    tblmatches
    WHERE   tblTeams.id = ?i dont know here what to insert? 
END
4

2 回答 2

0

AFAIK,要在 tblMatches 上调用触发器,您需要为该表中的所有列提供值,并且只为该表中的列提供值,这意味着,您不能将团队名称传递给触发器,以便它可以用于解析团队ID。

如果我要这样做,我只需创建一个表以按原样插入原始数据,让导入向导将记录写入该表,在该表上定义一个触发器以将记录插入两个派生表,即。tblTeams,tblMatches。(SQL Server 触发器

我尝试写一个(没有机会验证,因为我没有 SQL 服务器)

CREATE TRIGGER teams.process ON teams
AFTER INSERT
AS
BEGIN
    DECLARE @homeTeamId INT
    DECLARE @awayTeamId INT
    DECLARE @maxTeamId INT
    DECLARE @matchId INT

    SELECT @maxTeamId = 0
    SELECT @maxTeamId = ISNULL(MAX(teamId), 0) from tblTeams

    --- Check if home team has already been inserted into the table.
    SELECT @homeTeamId = -1
    SELECT 
        @homeTeamId = teamId 
    FROM 
        tblTeams t
        JOIN inserted i
        ON t.teamName = i.hometeam
    IF (@homeTeamId = -1) 
    BEGIN
        SELECT @homeTeamId = @maxTeamId + 1
        SELECT @maxTeamId = @maxTeamId + 1
        INSERT INTO tblTeams SELECT @homeTeamId, i.hometeam FROM inserted i
    END

    --- Check if away team has already been inserted into the table.
    SELECT @awayTeamId = -1
    SELECT 
        @awayTeamId = teamId 
    FROM 
        tblTeams t
        JOIN inserted i
        ON t.teamName = i.awayteam
    IF (@awayTeamId = -1) 
    BEGIN
        SELECT @awayTeamId = @maxTeamId + 1
        SELECT @maxTeamId = @maxTeamId + 1
        INSERT INTO tblTeams SELECT @awayTeamId, i.awayteam FROM inserted i
    END

    -- insert a record into the matches table with the home team ID and away team ID.
    SELECT @matchId = 0
    SELECT @matchId = ISNULL(MAX(MatchId), 0) FROM tblMatches
    INSERT INTO tblMatches 
    SELECT @matchId + 1, @homeTeamId, @awayTeamId, i.score 
    FROM inserted i
END 
于 2012-09-11T17:48:44.980 回答
0

如果您想在表中使用不同的表示形式,那么您可能必须实现一个视图,并通过它而不是基表执行插入。

就像是:

CREATE TABLE realMatches (
    MatchID int IDENTITY(1,1) not null, /* Identity? */
    HomeTeamID int not null,
    AwayTeamID int not null,
    Score int not null, /* int? */
    constraint PK_realMatches PRIMARY KEY (MatchID),
    constraint FK_Matches_HomeTeams (HomeTeamID) references tblTeams (TeamID),
    constraint FK_Matches_AwayTeams (AwayTeamID) references tblTeams (TeamID)
)
GO
CREATE VIEW tblMatches
AS
    SELECT
        MatchID,
        ht.TeamName as HomeTeam,
        at.TeamName as AwayTeam,
        Score
    FROM
        realMatches m
           inner join
        tblTeams ht
           on
               m.HomeTeamID = ht.TeamID
           inner join
        tblTeams at
           on
               m.AwayTeamID = at.TeamID
GO
CREATE TRIGGER T_Matches ON tblMatches
INSTEAD OF INSERT
AS
     SET NOCOUNT ON

     INSERT INTO realMatches (HomeTeamID,AwayTeamID,Score)
     SELECT ht.TeamID,at.TeamID,i.Score
     FROM
        inserted i
           inner join
        tblTeam ht
           on
              i.HomeTeam = ht.TeamName
           inner join
        tblTeam at
           on
              i.AwayTeam = at.TeamName

您现在可以(假设“A Team”和“Team America”存在于 中tblTeams):

INSERT INTO tblMatches (HomeTeam,AwayTeam,Score)
VALUES ('A Team','Team America',19)

当然,这(还)不涉及任何试图更改匹配表中的球队的更新,也没有处理如果球队还不存在的情况下该怎么办tblTeam,但你还没有问过这些。

于 2012-09-11T18:29:59.667 回答