sql触发器:在插入之前从另一个表中选择FK

sql触发器:在插入之前从另一个表中选择FK,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我有两个数据库表 tblTeams:PK TeamID,TeamName tblMatches:PK match id,FK HomeTeam,FK AwayTeam,Score 我正在使用SQL Server 2008,并通过向导从.csv文件导入行。csv中的列为hometeam,awayteam,score。因此,在插入tblMatches之前,我需要一个触发器来查找团队的FK,并在tblMatches中插入外键而不是名称 请帮忙 CREATE TRIGGER tblmatches_Bef

我有两个数据库表

  • tblTeams
    PK TeamID
    TeamName
  • tblMatches
    PK match id
    FK HomeTeam
    FK AwayTeam,Score
    我正在使用SQL Server 2008,并通过向导从
    .csv
    文件导入行。
    csv
    中的列为
    hometeam
    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
    

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

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

    我试图编写一个(没有机会验证,因为我没有SQL server)


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

    比如:

    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
    
    您现在可以(假设
    tblTeams
    中存在“一个团队”和“美国团队”):


    当然,这(还)不涉及任何试图改变比赛表中球队的更新,也不涉及如果球队在
    tblTeam
    中还不存在该怎么办,但你还没有问过这些问题。

    以下是我尝试过的。我不熟悉触发器:)如何使用sql server 2008的导入向导读取
    .csv
    文件。但我认为这不重要。因为触发器将在插入一行时执行,对吗?@user1292656,只是想知道您是否使用任何高级语言来解析CSV并插入记录。嗯,所以我必须在插入后使用。你能帮我扳机吗?@user1292656,我试着按照问题中的细节写一个。您可能需要相应地验证和使用它。我收到一个错误消息207,级别16,状态1,过程过程,第46行无效列名“score”。@user1292656,这是因为我应该使用插入的
    表从团队获取当前记录的分数。编辑了我的触发器定义。请现在检查。嗯,还是出了点问题。Msg 4104,级别16,状态1,程序过程,第46行,无法绑定多部分标识符“i.score”。
    
    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
    
    INSERT INTO tblMatches (HomeTeam,AwayTeam,Score)
    VALUES ('A Team','Team America',19)