【问题标题】:T-SQL stored procedure executes select twice?T-SQL存储过程执行select两次?
【发布时间】:2019-02-25 17:57:45
【问题描述】:
DROP PROCEDURE showMatchOnDate
go

CREATE PROCEDURE showMatchOnDate 
     @MatchDate DATE
AS
    DECLARE @tempTeams TABLE
                       (
                           Id CHAR(3) PRIMARY KEY,
                           name VARCHAR(40),
                           nomatches INT,
                           owngoals INT,
                           othergoals INT,
                           points INT
                       )

    INSERT INTO @tempTeams(Id, name, nomatches, owngoals, othergoals, points)
        SELECT * FROM teams

    DECLARE @homeGoals INT
    DECLARE @outGoals INT
    DECLARE @homeID CHAR(3)
    DECLARE @outID CHAR(3)

    DECLARE @count INT
    DECLARE @totalAmount INT

    SET @totalAmount = (SELECT COUNT(*) FROM matches WHERE matchdate <= @MatchDate)
    SET @count = 1

    SELECT @totalAmount

    WHILE (@count <= @totalAmount)
    BEGIN
        SELECT @homeGoals = (SELECT homegoal FROM matches WHERE Id = @count)
        SELECT @outGoals = (SELECT outgoal FROM matches WHERE Id = @count)
        SELECT @homeID = (SELECT homeid FROM matches WHERE Id = @count)
        SELECT @outID = (SELECT outid FROM matches WHERE Id = @count)

        UPDATE @tempTeams
        SET nomatches = nomatches + 1
        WHERE Id = @homeID OR Id = @outID

        UPDATE @tempTeams
        SET owngoals = owngoals + @homeGoals
        WHERE Id = @homeID

        UPDATE @tempTeams
        SET owngoals = owngoals + @outGoals
        WHERE Id = @outID

        UPDATE @tempTeams
        SET othergoals = othergoals + @outGoals
        WHERE Id = @homeID

        UPDATE @tempTeams
        SET othergoals = othergoals + @homeGoals
        WHERE Id = @outID

        UPDATE @tempTeams
        SET points = points + 3
        WHERE Id = @homeID AND @homeGoals > @outGoals

        UPDATE @tempTeams
        SET points = points + 3
        WHERE Id = @outID AND @outGoals > @homeGoals

        IF @outGoals = @homeGoals
            UPDATE @tempTeams
            SET points = points + 1
            WHERE Id = @homeID OR (Id = @outID)

        SET @count = @count + 1
    END

    SELECT * FROM @tempTeams
go

由于某种原因,当我运行它时,我得到了每个项目的副本。我不想要。显然我想要正确的值,应该是 154 个不同的项目。但相反,我得到 308,并且每个项目都是重复的。有谁知道为什么?

【问题讨论】:

  • 我只看到来自@TempTeams 的一个插入,因此您应该得到该插入返回的任何计数。您是否直接从 SQL 中运行此选择以确认那里的计数? select * from teams(不应该使用 select *,应该只选择您需要的字段(即使是所有字段),因为如果您稍后更新表结构,它将破坏这个 SP
  • 还有什么SQL技术?
  • 是什么让你认为 154 是正确的值?
  • 它在 Microsoft SQL 服务器管理中的 Tsql,我知道它必须是 154,因为原始表中存在许多插入

标签: sql-server database tsql


【解决方案1】:

首先检查你的“团队”表,你可以在这里有额外的数据,如果有,删除重复的。

最佳实践还需要编写显式字段以避免将来出现错误,如下所示:

insert into @tempTeams(Id,name,nomatches,owngoals,othergoals,points)
   select Id,name,nomatches,owngoals,othergoals,points
   from teams

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-15
    • 2017-08-18
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 2018-10-03
    • 2013-05-28
    • 2013-01-05
    相关资源
    最近更新 更多