我有一个网站,学生可以登录,在该表单上,我将显示前3名学生连同他们的总分和id。
为了获取这些信息,我有一个存储过程,它以@StudentId作为输入参数,并返回前3名学生及其总分以及登录学生总分和他的排名。因此,我的查询返回的行总数将为4,如果登录的学生在前3名学生中,则返回的行总数将为3。
下面是对此的查询,我不打算将数据如何填充到@StudentScore表中,因为这是一个非常简单的查询,包含一些If条件和一个简单的联接。
DECLARE @StudentScore AS TABLE (StudentId INT, [Score] INT)
DECLARE @StudentRankTable AS TABLE (StudentId INT, [TotalScore] INT, [StudentRank] INT)
INSERT INTO @StudentRankTable
SELECT
[StudentId],
SUM([Score]) AS [TotalScore],
DENSE_RANK () OVER (ORDER BY SUM([Score]) DESC) [Rank]
FROM @StudentScore
GROUP BY [StudentId] ORDER BY [Rank]
SELECT TOP 3
[StudentId], [TotalScore], [StudentRank]
FROM StudentRankTable
UNION
SELECT
[StudentId], [TotalScore], [StudentRank]
FROM @StudentRankTable
WHERE [StudentId] = @StudentId
ORDER BY [StudentRank]下面是@StudentScore临时表中的示例数据的样子。
StudentId Score
101 21
103 43
101 11
107 5
103 7该查询按预期工作,我正在获得所需的输出。
问题:我经常收到异常消息,表示此查询已超时,但当我尝试在Server上运行此查询时,查询将在3-4秒内返回输出。我真的不明白问题在哪里,因为当我使用不同的@StudentId运行查询时,我在3-4中得到了输出,但仍然看到了下面的异常消息
执行超时已过期。在操作完成或服务器没有响应之前经过的超时时间。
在这个问题上有什么帮助和建议吗?
注:这并不是每次学生登录时都会发生,但很多次都是这样。
发布于 2021-04-01 19:30:45
也许在SSMS中您可以查看查询或存储过程的结果,但是您的代码不返回查询或表,我认为您应该创建一个返回表的函数来获取所需的内容。
您可以创建视图来替换临时表,还可以创建一个函数以从任何地方获得您想要的结果,即您想要的API,尝试如下
create view v_studentRank as (
SELECT [StudentId],
SUM([Score]) AS [TotalScore],
DENSE_RANK () OVER (ORDER BY SUM([Score]) DESC) [Rank]
FROM StudentScore
GROUP BY [StudentId]
);
go
create function f_studentRank(
@StudentId int)
returns table
as
return
(
SELECT TOP(3) [StudentId], [TotalScore], [Rank]
FROM (
SELECT *,
ROW_NUMBER() OVER (ORDER BY [Rank]) AS [RowNumber]
FROM v_studentRank) as v
WHERE [RowNumber] <= 3
UNION
SELECT [StudentId], [TotalScore], [Rank]
FROM v_StudentRank
WHERE [StudentId] = @StudentId
);
go
select *
from f_studentRank(4)
order by [Rank]您可以找到有关这里的更多信息。
https://stackoverflow.com/questions/66910337
复制相似问题