web-dev-qa-db-ja.com

インライン関数を作成するMicrosoft SQL Server

こんにちは、私はSQLに完全に慣れていないため、特定の期間の学生のGPAを計算するユーザー定義関数(UDF)を作成する必要があります。入力はStudentId intClassStartDateStart datetimeClassStartDateEnd datetime。出力は、ClassStartDateStartとClassStartDateEndの間で行われたすべてのクラスの学生のGPAです。また、この新しい関数を呼び出すスクリプトを指定して、選択したパラメーター値を渡します。コードを作成しようとしましたが、どこから始めればよいかわかりません。ここに私がこれまでに持っているものがあります:

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;

学生のための私のテーブルはこれです:

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)

私がしなければならないのは、生徒のクラスGPAを表示する集約インライン関数を作成することです。入力が認識されるように、最初にストアドプロシージャを作成する必要がありますか?

5
Zechariah

入力が認識されるように、最初にストアドプロシージャを作成する必要がありますか?

各パラメーターの先頭に@記号がありません。

関数の作成の詳細 ここ

基本を理解したら、これ article by Jeremiah Peschkaがインライン関数などの利点を説明します。基本的に、テーブル値関数がインラインでない場合、呼び出し元のクエリによって返されるすべての行に対して1回実行されます。これは非常に非効率的です。インラインテーブル値関数は、パラメーター化されたビューと呼ばれます。

関数はスカラー関数であり、常に各行に対して1回実行されますが、以下のコードを使用してインラインテーブル値関数に変換できます。

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; 

WITH SCHEMABINDINGオプションを使用すると、誰もが関数で使用されているスキーマを編集して破壊することができなくなります。

9
James Anderson