【问题标题】:Execute function multiple times or create stored procedure多次执行函数或创建存储过程
【发布时间】:2016-09-26 22:04:20
【问题描述】:

假设我有这样的功能

SELECT 
    ROW_NUMBER() OVER (ORDER BY T1.FinalScore desc) as Position, 
    T1.Employee, T1.FinalScore
FROM 
    (SELECT 
         Position, Employee, AVG(Score) as FinalScore
     FROM 
         dbo.Answers
     WHERE 
         DATEPART(year, EvaluationDate) = @Year
     GROUP BY   
         Employee) as T1

这将返回一个像这样的表:

|--------|----------|-------|
|Position| Employee | FScore|
|========|==========|=======|
|   1    |   John   |  5.6  |
|   2    |   Tom    |  4.8  |
|   3    |   Paul   |  3.6  |
|   4    |   Mark   |  2.0  |

现在我需要用之前的表格和往年的信息创建一个趋势图。

我的问题是,最佳实践是什么,我是否应该从我的 asp.net 页面多次调用我的函数来检索多个表,并处理我页面上的信息。

或者我应该创建一个存储过程,多次执行此函数并将数据插入到临时表中?像这样:

CREATE TABLE #TOP 
(
     Position int, 
     Employee nvarchar(60), 
     Score decimal(18,2)
)

DECLARE @Flag as int

SET @Flag = @Year - 3

WHILE (@Year > @Flag)
BEGIN
   INSERT INTO #TOP
       SELECT * 
       FROM dbo.MyFunction(@Year)

   SET @Year = @Year -1
END

SELECT * FROM #TOP
DROP TABLE #TOP

【问题讨论】:

    标签: sql-server stored-procedures user-defined-functions


    【解决方案1】:

    首先,您可以将查询简化为:

       SELECT row_number() over (order by avg(Score)) as position,
              Employee, AVG(Score) as FinalScore
       FROM dbo.Answers
       WHERE DATEPART(year, EvaluationDate) = @Year
       GROUP BY Employee;
    

    然后,如果你想要这个所有年份,请使用partition by

       SELECT row_number() over (partition by year(EvaluationDate) order by avg(Score)) as position,
              Employee, AVG(Score) as FinalScore
       FROM dbo.Answers
       GROUP BY Employee, year(EvaluationDate);
    

    【讨论】:

    • 好吧,我之前确实看过 partition by 子句,但它不适合我的情况,评估的实际日期不是按年份,我省略了它以简化查询,有 2员工每年进行一次评估,一次在 7 月进行,第二次在次年 1 月进行。因此,即 2015 年,我在 2015 年 7 月进行了评估,第二次是在 2016 年 1 月
    • 函数的简化查询确实有帮助,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多