SQL Server のユーザー定義関数を変更・削除する

SQL Server のユーザー定義関数を変更・削除する

前回 「 SQL Server のユーザー定義のテーブル値関数を作成する 」 では、テーブルを返す、ユーザー定義のテーブル値関数を作ってみました。

今回は、既存のユーザー定義の関数を変更・削除してみましょう。

「 SQL Server のユーザー定義のテーブル値関数を作成する 」 で生成したユーザー定義関数が存在している前提で進めます。


ユーザー定義関数を変更する

ユーザー定義関数を変更するには ALTER FUNCTION を使います。

ALTER FUNCTION [ ファンクション名 ] (
    [ @入力パラメーター名 1 ] [ 入力パラメーター名 1 のデータ型 ],
    [ @入力パラメーター名 2 ] [ 入力パラメーター名 2 のデータ型 ],
    [ @入力パラメーター名 3 ] [ 入力パラメーター名 3 のデータ型 ],
    ...
)  
RETURNS [ @戻り値のテーブル名 ] TABLE (
    [カラム名 1] [カラム名 1 のデータ型] [NULL or NOT NULLなどのテーブル定義],
    [カラム名 2] [カラム名 2 のデータ型] [NULL or NOT NULLなどのテーブル定義],
    [カラム名 3] [カラム名 3 のデータ型] [NULL or NOT NULLなどのテーブル定義],
    ...
)
AS
BEGIN

    [ ファンクションで処理したい一連の T-SQL ステートメント
      @戻り値のテーブルに値をインサートする ]

    RETURN;

END;

こちらは、テーブルを返すユーザー定義関数の例ですが、CREATE の代わりに ALTER というキーワードを使う以外は CREATE の時と同じです。

詳しくはそれぞれの作成のページをご確認ください。
SQL Server のユーザー定義のスカラー値関数を作成する
SQL Server のユーザー定義のテーブル値関数を作成する

スクリプトを別でソース管理しているのでなければ、既存のユーザー定義関数を変更する時は、データベースに保存されているものを元に変更することも多いかと思います。

生成したユーザー定義関数は、SQL Server Management Studio のプログラミング > 関数 > テーブル値関数 ・スカラー値関数の箇所で見つけることができます。

SQL Server のユーザー定義関数を変更・削除する 1

変更したいユーザー定義関数を選んで右クリックで [変更] を選択すると、次のように ALTER FUNCTION のステートメントがクエリー画面に出てきます。

SQL Server のユーザー定義関数を変更・削除する 2

SQL Server のユーザー定義関数を変更・削除する 3


例えば、ufnStudentTestReportGet では、TestName に TestNameEn の値を返していましたが、TestNameJp も返すように変更してみましょう。

ALTER FUNCTION [dbo].[ufnStudentTestReportGet] (
    @StudentID INT
)  
RETURNS @StudentTestReport TABLE (
    TestID          INT NOT NULL,
    TestNameEn      NVARCHAR(50) NOT NULL,
    TestNameJp      NVARCHAR(50) NOT NULL,
    Score           INT NULL,
    TestAvgScore    DECIMAL(5,2) NULL
)
AS
BEGIN
    
    INSERT INTO @StudentTestReport (
                TestID,
                TestNameEn,
                TestNameJp,
                Score
        )
        SELECT  T.TestID,
                T.TestNameEn,
                T.TestNameJp,
                TR.Score
        FROM    TestResult AS TR
                    INNER JOIN Test AS T
                        ON TR.TestID = T.TestID
        WHERE   TR.StudentID = @StudentID;


    UPDATE  T
    SET     TestAvgScore = A.TestAvgScore
    FROM    @StudentTestReport AS T
                INNER JOIN 
                    (SELECT     TestID,
                                AVG(CAST(Score AS DECIMAL)) AS TestAvgScore
                     FROM       TestResult
                     WHERE      Score IS NOT NULL
                     GROUP BY   TestID) AS A
                ON T.TestID = A.TestID;

    RETURN;

END

スクリプトを変更後に [実行] ボタンをクリックすると、ユーザー定義関数が変更されます。

SQL Server のユーザー定義関数を変更・削除する 4


以下のスクリプトを実行して、TestNameJp も返ってくるか確認してみましょう。

SELECT  *
FROM    dbo.ufnStudentTestReportGet(1);

[ 実行結果 ]
SQL Server のユーザー定義関数を変更・削除する 5

ufnStudentTestReportGet が変更されたことが確認できました。


ユーザー定義関数を削除する

ユーザー定義関数を削除するには DROP FUNCTION を使います。

DROP FUNCTION [ ファンクション名 ];

それでは、次のスクリプトを実行して、 ufnStudentTestReportGet を削除してみましょう。

DROP FUNCTION ufnStudentTestReportGet;

SQL Server のユーザー定義関数を変更・削除する 6

ufnStudentTestReportGet が削除されました。

© 2010-2024 SQL Server 入門