【发布时间】: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