我在Microsoft SQL Server 2014

时间:2017-11-16 03:38:01

标签: sql sql-server triggers sql-server-2014

我正在尝试在tplayoffStatus上创建一个触发器,以便不允许团队插入多个丢失的表中。将值插入表tplayoffStatus时,我一直得到的错误是

  

子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

任何人都可以帮我吗?我的SELECT语句在列丢失中返回多个值是错误的吗?

SQL Server 2014表架构:

CREATE TABLE tcollegeFootballTeams
(
    TeamAbbreviation varchar(5) NOT NULL PRIMARY KEY,
    TeamName varchar(50) NOT NULL,
    City varchar(50) NOT NULL,
    State varchar(2) NOT NULL,
    Wins int NOT NULL,
    Losses int NOT NULL
)  

CREATE TABLE tplayoffStatus
(
    TeamName varchar(50) NOT NULL PRIMARY KEY,
    TeamAbbreviation varchar(5) NOT NULL FOREIGN KEY REFERENCES tcollegeFootballTeams(TeamAbbreviation)
); 

CREATE TRIGGER [dbo].[trgNoPlayoffForYou] 
ON [dbo].[tplayoffStatus]
AFTER INSERT
AS
    DECLARE @Losses INT
    DECLARE @ErrorMessage VARCHAR(30)

    SELECT @Losses = (SELECT Losses 
                      FROM dbo.tcollegeFootballTeams 
                      WHERE (Losses > 1))

    IF (@Losses = 'True') 
    BEGIN
        SET @ErrorMessage = 'You may not enter the playoffs with more than 1 loss'
        PRINT @ErrorMessage
        ROLLBACK TRANSACTION
    END

查询1:

INSERT INTO tcollegeFootballTeams (TeamAbbreviation, TeamName, City, State, Wins, Losses)
VALUES ('OSU', 'THE Ohio State University', 'Columbus', 'OH', 10, 2)

[结果] [2]

查询2:

INSERT INTO tcollegeFootballTeams (TeamAbbreviation, TeamName, City, State, Wins, Losses  )
VALUES ('BAMA', 'Alabama', 'Tuscaloosa', 'AL', 12, 0)

[结果] [3]

查询3:

INSERT INTO tcollegeFootballTeams (TeamAbbreviation, TeamName, City, State, Wins, Losses  )
VALUES ('UGA', 'Georgia', 'Athens', 'GA', 11, 1)

[结果] [4]

查询4:

INSERT INTO tcollegeFootballTeams (TeamAbbreviation, TeamName, City, State, Wins, Losses)
VALUES ('CLEM', 'Clemson', 'Clemson', 'SC', 11, 1)

[结果] [5]

查询5:

INSERT INTO tcollegeFootballTeams (TeamAbbreviation, TeamName, City, State, Wins, Losses)
VALUES ('WIS', 'Wisconsin', 'Madison', 'WI', 11, 1)

[结果] [6]

查询6:

INSERT INTO tcollegeFootballTeams (TeamAbbreviation, TeamName, City, State, Wins, Losses)
VALUES ('ND', 'Notre Dame', 'South Bend', 'IN', 10, 2)

[结果] [7]

查询7:

INSERT INTO tcollegeFootballTeams (TeamAbbreviation, TeamName, City, State, Wins, Losses)
VALUES ('OKLA', 'Oklahoma', 'Norman', 'OK', 10, 2)

[结果] [8]

查询8:

INSERT INTO tcollegeFootballTeams (TeamAbbreviation, TeamName, City, State, Wins, Losses)
VALUES ('MIAF', 'Miami of Florida', 'Coral Gables', 'FL', 10, 2)

2 个答案:

答案 0 :(得分:2)

你的触发错了。您需要在inserted表中查询已插入的记录,并加入tcollegeFootballTeams的{​​{1}}表

Losses

答案 1 :(得分:-2)

您可以尝试这样的事情(请记住,损失是数字而不是字符串或布尔值):

DECLARE @TeamAbbr varchar(5);
Select @TeamAbbr = TeamAbbreviation FROM inserted; /* logic table for record just inserted   */
Select @Losses = Losses FROM dbo.tcollegeFootballTeams WHERE (TeamAbbreviation =  @TeamAbbr);

IF (@Losses > 1) 
BEGIN
    SET  @ErrorMessage = 'You may not enter the playoffs with more than 1 loss'
    Print @ErrorMessage
    Rollback Transaction
END