Microsoft SQL Server 创建内联函数

Zec*_*iah 5 sql-server t-sql functions

我对 SQL 完全陌生,我必须编写一个用户定义的函数 (UDF) 来计算给定时间范围内学生的 GPA。这些输入StudentId intClassStartDateStart datetime以及ClassStartDateEnd datetime。其中输出应该是学生在ClassStartDateStart 和之间参加的所有课程的 GPA ClassStartDateEnd。此外,提供调用此新函数的脚本,将您选择的参数值传递给它。我尝试创建一个代码,但不知道从哪里开始。这是我到目前为止所拥有的:

USE [Master]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION GPAofStudents 
  (StudentID int, 
   ClassStartDateStart datetime, 
   ClassStartDateEnd datetime)
  RETURNS decimal(3,2) 
  AS
BEGIN 
DECLARE AvgGPA decimal(5,2); 
SET AvgGPA = (SELECT AVG(Class_GPA)
FROM Students_Classes 
  WHERE Student_ID = StudentID 
    AND Start_Date > ClassStartDateStart 
    AND Start_Date <= ClassStartDateEnd 
    AND Class_GPA > 0; 
    RETURN AvgGPA; 
END;
Run Code Online (Sandbox Code Playgroud)

我给学生的桌子是这样的:

CREATE TABLE [dbo].[Students_Classes](
    [Student_Class_ID] [int] IDENTITY(1,1) NOT NULL,
    [Student_ID] [int] NOT NULL,
    [Class_ID] [int] NOT NULL,
    [Start_Date] [date] NOT NULL,
    [Assignment1] [int] NULL,
    [Assignment2] [int] NULL,
    [Assignment3] [int] NULL,
    [Assignment4] [int] NULL,
    [Class_GPA] [int] NULL,
     CONSTRAINT [Student_Class_ID] PRIMARY KEY CLUSTERED 
(
USE [A_University_Database]
INSERT INTO Students_Classes
([Student_ID],[Class_ID],[Start_Date],[Assignment1],[Assignment2],[Assignment3],
 [Assignment4],[Class_GPA])
    VALUES
('1', '5', '2010-05-30', '86', '92', '69', '99', NULL),
('1', '6', '2010-05-30', '86', '92', '69', '99', NULL),
('2', '2', '2010-05-30', '99', '85', '91', '79', NULL),
('2', '7', '2010-05-30', '99', '85', '91', '79', NULL),
('3', '3', '2010-10-01', '67', '91', '71', '100', NULL),
('3', '4', '2010-10-01', '67', '91', '71', '100', NULL),
('4', '5', '2009-02-21', '56', '93', '72', '86', NULL),
('4', '6', '2009-02-21', '56', '93', '72', '86', NULL)
Run Code Online (Sandbox Code Playgroud)

我要做的是创建一个聚合内联函数,显示学生班级 GPA。我是否需要先创建一个存储过程才能识别输入?

Jam*_*son 9

我是否需要先创建一个存储过程才能识别输入?

@在每个参数的开头都缺少符号。

在此处了解有关编写函数的更多信息

一旦您了解了基础知识,Jeremiah Peschka 撰写的这篇文章将解释内联函数的好处等等。基本上,如果您的表值函数不是内联的,那么它将为调用查询返回的每一行执行一次。这可能非常低效。内联表值函数可以称为参数化视图。

您的函数是一个标量函数,它总是对每一行执行一次,但可以使用以下代码将其转换为内联表值函数。

CREATE FUNCTION dbo.GPAofStudents 
  (@StudentID int, 
   @ClassStartDateStart date, 
   @ClassStartDateEnd date)

RETURNS TABLE WITH SCHEMABINDING
AS
RETURN
    SELECT  @StudentID AS Student_ID,
            AVG(Class_GPA) AS GPA
    FROM    dbo.Students_Classes 
    WHERE   Student_ID = @StudentID 
            AND Start_Date > @ClassStartDateStart 
            AND Start_Date <= @ClassStartDateEnd 
            AND Class_GPA > 0; 
Run Code Online (Sandbox Code Playgroud)

使用该WITH SCHEMABINDING选项将阻止任何人编辑您的函数使用的架构并破坏它。