首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server :多次从存储过程中获取执行超时异常,但在执行查询时它会快速返回输出

Server :多次从存储过程中获取执行超时异常,但在执行查询时它会快速返回输出
EN

Stack Overflow用户
提问于 2021-04-01 19:16:25
回答 1查看 105关注 0票数 1

我有一个网站,学生可以登录,在该表单上,我将显示前3名学生连同他们的总分和id。

为了获取这些信息,我有一个存储过程,它以@StudentId作为输入参数,并返回前3名学生及其总分以及登录学生总分和他的排名。因此,我的查询返回的行总数将为4,如果登录的学生在前3名学生中,则返回的行总数将为3。

下面是对此的查询,我不打算将数据如何填充到@StudentScore表中,因为这是一个非常简单的查询,包含一些If条件和一个简单的联接。

代码语言:javascript
复制
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临时表中的示例数据的样子。

代码语言:javascript
复制
StudentId Score
   101      21
   103      43
   101      11
   107      5
   103      7

该查询按预期工作,我正在获得所需的输出。

问题:我经常收到异常消息,表示此查询已超时,但当我尝试在Server上运行此查询时,查询将在3-4秒内返回输出。我真的不明白问题在哪里,因为当我使用不同的@StudentId运行查询时,我在3-4中得到了输出,但仍然看到了下面的异常消息

执行超时已过期。在操作完成或服务器没有响应之前经过的超时时间。

在这个问题上有什么帮助和建议吗?

注:这并不是每次学生登录时都会发生,但很多次都是这样。

EN

回答 1

Stack Overflow用户

发布于 2021-04-01 19:30:45

也许在SSMS中您可以查看查询或存储过程的结果,但是您的代码不返回查询或表,我认为您应该创建一个返回表的函数来获取所需的内容。

您可以创建视图来替换临时表,还可以创建一个函数以从任何地方获得您想要的结果,即您想要的API,尝试如下

代码语言:javascript
复制
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]

您可以找到有关这里的更多信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66910337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档