ALTER FUNCTION (Transact-SQL)

CREATE FUNCTION ステートメントを実行して作成された既存の Transact-SQL 関数または CLR 関数を、権限を変更したり、従属する関数、ストアド プロシージャ、またはトリガーに影響を及ぼしたりせずに変更します。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

Scalar Functions
ALTER FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type 
    [ =default ] } 
    [ ,...n ]
  ]
)
RETURNS return_data_type
    [ WITH <function_option> [ ,...n ] ]
    [ AS ]
    BEGIN 
        function_body 
        RETURN scalar_expression
    END
[ ; ]

Inline Table-valued Functions
ALTER FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type 
    [ =default ] } 
    [ ,...n ]
  ]
)
RETURNS TABLE
    [ WITH <function_option> [ ,...n ] ]
    [ AS ]
    RETURN [ ( ] select_stmt [ ) ]
[ ; ]

Multistatement Table-valued Functions
ALTER FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type 
    [ =default ] } 
    [ ,...n ]
  ]
)
RETURNS @return_variable TABLE <table_type_definition>
    [ WITH <function_option> [ ,...n ] ]
    [ AS ]
    BEGIN 
        function_body 
        RETURN
    END
[ ; ]

CLR Functions
ALTER FUNCTION [ schema_name. ] function_name ( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type 
    [ =default ] } 
    [ ,...n ]
)
RETURNS { return_data_type | TABLE <clr_table_type_definition> }
    [ WITH <clr_function_option> [ ,...n ] ]
    [ AS ] EXTERNAL NAME <method_specifier>
[ ; ]

<method_specifier>::=
    assembly_name.class_name.method_nameFunction Options<function_option>::= 
{
    [ ENCRYPTION ]
  | [ SCHEMABINDING ]
  | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
  | [ EXECUTE_AS_Clause ]
}

<clr_function_option>::=
}
    [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
  | [ EXECUTE_AS_Clause ]
}

Table Type Definitions<table_type_definition>:: = ( { <column_definition> <column_constraint> 
  | <computed_column_definition> } 
    [ <table_constraint> ] [ ,...n ]
)<clr_table_type_definition>:: = ( { column_name data_type } [ ,...n ] )<column_definition>::=
{
    { column_name data_type }
    [ [ DEFAULT constant_expression ] 
      [ COLLATE collation_name ] | [ ROWGUIDCOL ]
    ]
    | [ IDENTITY [ (seed ,increment ) ] ]
    [ <column_constraint> [ ...n ] ] 
}
<column_constraint>::= 
{
    [ NULL | NOT NULL ] 
    { PRIMARY KEY | UNIQUE }
      [ CLUSTERED | NONCLUSTERED ] 
        [ WITH FILLFACTOR = fillfactor 
        | WITH ( < index_option > [ , ...n ] )
      [ ON { filegroup | "default" } ]
  | [ CHECK (logical_expression ) ] [ ,...n ]
}

<computed_column_definition>::=column_name AS computed_column_expression<table_constraint>::=
{ 
    { PRIMARY KEY | UNIQUE }
      [ CLUSTERED | NONCLUSTERED ] 
      (column_name [ ASC | DESC ] [ ,...n ] )
        [ WITH FILLFACTOR = fillfactor 
        | WITH ( <index_option> [ , ...n ] )
  | [ CHECK (logical_expression ) ] [ ,...n ]
}

<index_option>::=
{ 
    PAD_INDEX = { ON | OFF } 
  | FILLFACTOR = fillfactor 
  | IGNORE_DUP_KEY = { ON | OFF }
  | STATISTICS_NORECOMPUTE = { ON | OFF } 
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS ={ ON | OFF } 
}

引数

  • schema_name
    ユーザー定義関数が属するスキーマの名前です。

  • function_name
    変更するユーザー定義関数です。

    注意注意

    パラメーターを指定しない場合でも、関数名の後にはかっこが必要です。

  • **@**parameter_name
    ユーザー定義関数内のパラメーターです。1 つ以上のパラメーターを宣言できます。

    1 つの関数では、最高 2,100 個のパラメーターを使用できます。宜言した各パラメーターの値は、関数の実行時に、ユーザーが指定する必要があります (そのパラメーターの既定値が定義されていない場合)。

    最初の文字をアット マーク (@) にしてパラメーター名を指定します。パラメーター名は識別子のルールに従っている必要があります。パラメーターは関数に対してローカルです。同じパラメーター名を他の関数で使用できます。パラメーターは定数の代わりとしてのみ使用できます。パラメーターは、テーブル名、列名、またはその他のデータベース オブジェクト名の代わりに使用することはできません。

    注意注意

    ストアド プロシージャまたはユーザー定義関数でパラメーターを渡すとき、あるいはバッチ ステートメントで変数を宣言して設定するときには、ANSI_WARNINGS が無視されます。たとえば、変数を char(3) として定義し、3 文字より長い値に設定すると、データは定義されたサイズに切り捨てられ、INSERT または UPDATE ステートメントは成功します。

  • [ type_schema_name. ] parameter_data_type
    パラメーターのデータ型です。このデータ型が属するスキーマを指定することもできます。Transact-SQL 関数の場合は、CLR ユーザー定義型を含めたデータ型のうち、timestamp を除くすべてのデータ型を指定できます。CLR 関数の場合は、CLR ユーザー定義型を含めたデータ型のうち、text、ntext、image、および timestamp を除くすべてのデータ型を指定できます。非スカラー型の cursor および table は、Transact-SQL 関数と CLR 関数の両方でパラメーターのデータ型として指定できません。

    type_schema_name を指定しない場合、SQL Server 2005 データベース エンジンは次の順序で parameter_data_type を検索します。

    • SQL Server システム データ型の名前を含むスキーマ

    • 現在のデータベースの現在のユーザーの既定のスキーマ

    • 現在のデータベースの dbo スキーマ

  • [ **=**default ]
    パラメーターの既定値です。default 値が定義されている場合は、パラメーターに値を指定せずに関数を実行できます。

    注意注意

    varchar(max) データ型および varbinary(max) データ型の場合を除いて、CLR 関数には既定のパラメーター値を指定できます。

    関数のパラメーターに既定値がある場合に、既定値を取得する目的でその関数を呼び出すときは、DEFAULT キーワードを指定する必要があります。この動作は、ストアド プロシージャで既定値を持つパラメーターを使用する場合とは異なります。ストアド プロシージャの場合は、パラメーターを省略すると既定値が暗黙的に使用されます。

  • return_data_type
    スカラー ユーザー定義関数の戻り値です。Transact-SQL 関数の場合は、CLR ユーザー定義型を含めたデータ型のうち、timestamp を除くすべてのデータ型を指定できます。CLR 関数の場合は、CLR ユーザー定義型を含めたデータ型のうち、text、ntext、image、および timestamp を除くすべてのデータ型を指定できます。非スカラー型の cursor および table は、Transact-SQL 関数と CLR 関数の両方で戻り値のデータ型として指定できません。

  • function_body
    総合して副作用 (テーブルの変更など) がない一連の Transact-SQL ステートメントによって関数の値が定義されることを指定します。function_body は、スカラー関数と複数ステートメントのテーブル値関数でのみ使用されます。

    スカラー関数の function_body は、総合してスカラー値と評価される一連の Transact-SQL ステートメントです。

    複数ステートメントのテーブル値関数の function_body は、TABLE 戻り変数にデータを格納する一連の Transact-SQL ステートメントです。

  • scalar_expression
    スカラー関数がスカラー値を返すように指定します。

  • TABLE
    テーブル値関数の戻り値がテーブルになるように指定します。テーブル値関数に渡すことができるのは、定数および **@**local_variables だけです。

    インライン テーブル値関数の TABLE 戻り値は、単一の SELECT ステートメントを使用して定義します。インライン関数には、関連付けられている戻り変数はありません。

    複数ステートメントのテーブル値関数の **@return_variable は TABLE 変数で、その関数の値として返される行の格納および蓄積に使用されます。@**return_variable は Transact-SQL 関数にのみ指定でき、CLR 関数には指定できません。

  • select-stmt
    インライン テーブル値関数の戻り値を定義する単一の SELECT ステートメントです。

  • EXTERNAL NAME <method_specifier>assembly_name.class_name.method_name
    関数でバインドするアセンブリのメソッドを指定します。assembly_name は、表示がオンになっている現在のデータベースに存在する SQL Server のアセンブリと一致している必要があります。class_name は、有効な SQL Server 識別子であること、およびアセンブリにクラスとして存在していることが必要です。このクラスの名前が名前空間で修飾されており、名前空間の部分がピリオド (.) で分けられている場合は、このクラス名を角かっこ ([]) または引用符 ("") で区切る必要があります。method_name は、有効な SQL Server 識別子であること、および指定されたクラスの静的メソッドとして存在していることが必要です。

    注意注意

    既定では、SQL Server は CLR コードを実行できません。共通言語ランタイム モジュールを参照するデータベース オブジェクトを作成、変更、および削除することは可能ですが、SQL Server でこれらの参照を実行するには、clr enabled オプションを有効にする必要があります。このオプションを有効にするには、sp_configure を使用します。

  • <table_type_definition>( { <column_definition> <column_constraint>   | <computed_column_definition> }   [ <table_constraint> ] [ ,...n])
    Transact-SQL 関数のテーブル データ型を定義します。テーブルの定義には、列の定義、および列またはテーブルの制約が含まれます。

  • < clr_table_type_definition > ( { column_namedata_type } [ ,...n] )
    CLR 関数のテーブル データ型を定義します。テーブルの定義には、列名およびデータ型のみが含まれます。

<function_option>::= and <clr_function_option>::=

関数に以下のオプションを 1 つ以上指定します。

  • ENCRYPTION
    ALTER FUNCTION ステートメントのテキストを含むカタログ ビューの列を、データベース エンジンが暗号化することを示します。ENCRYPTION を使用すると、その関数を SQL Server レプリケーションの一部としてパブリッシュできなくなります。CLR 関数には ENCRYPTION を指定できません。

  • SCHEMABINDING
    参照するデータベース オブジェクトに対して、その関数がバインドするように指定します。このバインドによって、他のスキーマ バインド オブジェクトがその関数を参照している場合に関数が変更されるのを防ぐことができます。

    関数からその参照先のオブジェクトへのバインドは、次のいずれかの操作が行われた場合にのみ削除されます。

    • 関数を削除した場合。

    • 関数を、SCHEMABINDING オプションを指定せずに ALTER ステートメントを使用して変更した場合。

    関数をスキーマ バインドにするために必要な条件の一覧については、「CREATE FUNCTION (Transact-SQL)」を参照してください。

  • RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT
    スカラー値関数の OnNULLCall 属性を指定します。指定しない場合は、既定で CALLED ON NULL INPUT が暗黙的に使用されます。つまり、NULL が引数として渡された場合でも、関数本体が実行されます。

    CLR 関数で RETURNS NULL ON NULL INPUT が指定されていると、SQL Server は、受け取った引数のいずれかが NULL であった場合に関数の本体を呼び出すことなく NULL を返すことができます。<method_specifier> に指定されたメソッドに RETURNS NULL ON NULL INPUT を示すカスタム属性が既に設定されている場合に、ALTER FUNCTION ステートメントで CALLED ON NULL INPUT を指定すると、ALTER FUNCTION ステートメントの指定が優先されます。CLR テーブル値関数には、OnNULLCall 属性を指定できません。

  • EXECUTE AS 句
    ユーザー定義関数が実行されるセキュリティ コンテキストを指定します。これにより、SQL Server が、関数で参照されているデータベース オブジェクトに対する権限を検証する際に使用するユーザー アカウントを制御できます。

    注意注意

    インライン ユーザー定義関数には EXECUTE AS を指定できません。

    詳細については、「EXECUTE AS 句 (Transact-SQL)」を参照してください。

< column_definition >::=

Table データ型を定義します。テーブルの定義には、列の定義および制約が含まれます。CLR 関数の場合は、column_name および data_type のみを指定できます。

  • column_name
    テーブルの列名です。列名は、識別子のルールに従っていること、およびテーブル内で一意であることが必要です。column_name は 1 ~ 128 文字で指定できます。

  • data_type
    列のデータ型を指定します。Transact-SQL 関数の場合は、CLR ユーザー定義型を含めたデータ型のうち、timestamp を除くすべてのデータ型を指定できます。CLR 関数の場合は、CLR ユーザー定義型を含めたデータ型のうち、text、ntext、image、char、varchar、varchar(max)、および timestamp を除くすべてのデータ型を指定できます。非スカラー型の cursor は、Transact-SQL 関数と CLR 関数の両方で、列のデータ型として指定できません。

  • DEFAULT constant_expression
    挿入の際に明示的な値を指定しない場合に、列に入力される値を指定します。constant_expression は、定数、NULL、またはシステム関数値です。DEFAULT 定義は、IDENTITY プロパティを持つ列を除くすべての列に適用できます。CLR テーブル値関数には DEFAULT を指定できません。

  • COLLATE collation_name
    列の照合順序を指定します。照合順序を指定しない場合、データベースの既定の照合順序が列に割り当てられます。照合順序名には、Windows 照合順序名または SQL 照合順序名を指定できます。照合順序名の一覧と詳細については、「Windows 照合順序名 (Transact-SQL)」および「SQL Server 照合順序名 (Transact-SQL)」を参照してください。

    COLLATE 句を使用して照合順序を変更できるのは、char 型、varchar、nchar、および nvarchar データ型の列だけです。

    CLR テーブル値関数には COLLATE を指定できません。

  • ROWGUIDCOL
    新しい列が行グローバル一意識別子列であることを示します。1 つのテーブルにつき、1 つの uniqueidentifier 列だけを ROWGUIDCOL 列に指定できます。ROWGUIDCOL プロパティは uniqueidentifier 列にだけ割り当てることができます。

    ROWGUIDCOL プロパティは、列に格納されている値の一意性を設定しません。また、ROWGUIDCOL プロパティは、テーブルに挿入される新しい行の値を自動的に生成しません。各列に対して一意な値を生成するには、INSERT ステートメントで NEWID 関数を使用します。既定値も指定できますが、NEWID を既定値として指定することはできません。

  • IDENTITY
    新しい列が ID 列であることを示します。テーブルに行が新しく追加されると、SQL Server は列に一意な増加値を設定します。ID 列は通常、PRIMARY KEY 制約と共に使用され、テーブルの一意な行識別子の役割を果たします。IDENTITY プロパティは、tinyint 型、smallint 型、int 型、bigint 型、decimal(p,0) 型、または numeric(p,0) 型の列に割り当てることができます。ID 列は、1 つのテーブルにつき、1 つだけ作成できます。バインドされた既定値および DEFAULT 制約を ID 列と組み合わせて使用することはできません。seed と increment は、両方を指定するか、どちらも指定しないでください。どちらも指定しないときの既定値は (1,1) です。

    CLR テーブル値関数には IDENTITY を指定できません。

    • seed
      テーブル内の先頭行に割り当てる整数値です。

    • increment
      テーブル内の連続する行に対して、seed の値に加える整数値です。

< column_constraint >::= and < table_constraint>::=

指定された列またはテーブルの制約を定義します。CLR 関数の場合、制約の種類として指定できるのは NULL だけです。名前付き制約は使用できません。

  • NULL | NOT NULL
    列で NULL 値を許すかどうかを示します。NULL は厳密には制約ではありませんが、NOT NULL と同じように指定することができます。CLR テーブル値関数には NOT NULL を指定できません。

  • PRIMARY KEY
    一意なインデックスによって、指定した列にエンティティの整合性を設定する制約です。テーブル値ユーザー定義関数では、1 つのテーブルにつき 1 つの列にのみ PRIMARY KEY 制約を作成できます。CLR テーブル値関数には PRIMARY KEY を指定できません。

  • UNIQUE
    一意なインデックスによって、指定した 1 つ以上の列にエンティティの整合性を持たせる制約です。1 つのテーブルは複数の UNIQUE 制約を持つことができます。CLR テーブル値関数には UNIQUE を指定できません。

  • CLUSTERED | NONCLUSTERED
    PRIMARY KEY 制約または UNIQUE 制約に対して、クラスター化インデックスまたは非クラスター化インデックスを作成することを示します。PRIMARY KEY 制約では CLUSTERED が、UNIQUE 制約では NONCLUSTERED が、それぞれ使用されます。

    CLUSTERED は 1 つの制約にのみ指定できます。UNIQUE 制約で CLUSTERED が指定され、PRIMARY KEY 制約も指定した場合には、PRIMARY KEY は NONCLUSTERED を使用します。

    CLR テーブル値関数には、CLUSTERED および NONCLUSTERED を指定できません。

  • CHECK
    1 つ以上の列に入力できる値を制限することによってドメインの整合性を設定する制約です。CLR テーブル値関数には CHECK 制約を指定できません。

    • logical_expression
      TRUE または FALSE を返す論理式です。

<computed_column_definition>::=

計算列を指定します。計算列の詳細については、「CREATE TABLE (Transact-SQL)」を参照してください。

  • column_name
    計算列の名前です。

  • computed_column_expression
    計算列の値を定義する式です。

<index_option>::=

PRIMARY KEY インデックスまたは UNIQUE インデックスのインデックス オプションを指定します。インデックス オプションの詳細については、「CREATE INDEX (Transact-SQL)」を参照してください。

  • PAD_INDEX = { ON | OFF }
    インデックスの埋め込みを指定します。既定値は OFF です。

  • FILLFACTOR = fillfactor
    インデックスの作成時または変更時に、データベース エンジンで各インデックス ページのリーフ レベルをどの程度まで使用するかを示す割合を指定します。fillfactor には、1 ~ 100 の整数値を指定する必要があります。既定値は 0 です。

  • IGNORE_DUP_KEY = { ON | OFF }
    挿入操作で、一意のインデックスに重複するキーの値を挿入しようとしたときのエラー応答を指定します。IGNORE_DUP_KEY オプションは、インデックスが作成または再構築された後の挿入操作のみに適用されます。既定値は OFF です。

  • STATISTICS_NORECOMPUTE = { ON | OFF }
    分布統計を再計算するかどうかを指定します。既定値は OFF です。

  • ALLOW_ROW_LOCKS = { ON | OFF }
    行ロックを許可するかどうかを指定します。既定値は ON です。

  • ALLOW_PAGE_LOCKS = { ON | OFF }
    ページ ロックを許可するかどうかを指定します。既定値は ON です。

説明

ALTER FUNCTION を使用してスカラー値関数をテーブル値関数に変更したり、その逆の変更を行ったりすることはできません。また、ALTER FUNCTION を使用してインライン関数を複数ステートメント関数に変更したり、その逆の変更を行ったりすることもできません。ALTER FUNCTION を使用して Transact-SQL 関数を CLR 関数に変更したり、その逆の変更を行ったりすることもできません。

以下の Service Broker ステートメントは、Transact-SQL ユーザー定義関数の定義に含めることができません。

  • BEGIN DIALOG CONVERSATION

  • END CONVERSATION

  • GET CONVERSATION GROUP

  • MOVE CONVERSATION

  • RECEIVE

  • SEND

権限

関数またはスキーマに対する ALTER 権限が必要です。関数でユーザー定義型が指定されている場合は、その型に対する EXECUTE 権限が必要です。