CREATE FUNCTION

適用対象:Microsoft Fabric の SQL 分析エンドポイントと Microsoft Fabric のウェアハウス

CREATE FUNCTION インラインテーブル値関数とスカラー関数を作成します。

スカラー UDF は、Fabric Data Warehouse のプレビュー機能です。

Von Bedeutung

Fabric Data Warehouse では、ユーザー テーブルに対するクエリでSELECT ... FROM化できる必要がありますが、インライン化できない関数を作成することはできます。 インラインでないスカラーUDFは限られたシナリオで機能します。 UDF をインライン化できるかどうかを確認できます

ユーザー定義関数とは、パラメータを受け取り、複雑な計算などのアクションを実行し、そのアクションの結果を値として返す Transact-SQL ルーチンのことです。 スカラー関数は、数値や文字列などのスカラー値を返します。 ユーザー定義のテーブル値関数 (TVF) は、テーブルを返します。

CREATE FUNCTIONを使って、以下の方法で使える再利用可能なT-SQLルーチンを作成します。

  • Transact-SQL ステートメントでは、次のような SELECT
  • Transact-SQL データ操作ステートメント (DML) ( UPDATEINSERT、および DELETE
  • 関数を呼び出すアプリケーション内で使用する
  • 別のユーザー定義関数の定義内で使用する
  • ストアド プロシージャを置換する

もし名前がなければ新しい関数を作成する CREATE OR ALTER FUNCTION を指定するか、既存の関数を一つの文で変更することができます。

Transact-SQL 構文表記規則

構文

スカラー関数の構文

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

<function_option>::=   
{  
    [ SCHEMABINDING ]  
  | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]  
}  

インライン テーブル値関数の構文

CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
    [ = default ] }
    [ ,...n ]
  ]
)
RETURNS TABLE
    [ WITH SCHEMABINDING ]
    [ AS ]
    RETURN [ ( ] select_stmt [ ) ]
[ ; ]

引数

schema_name

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

function_name

ユーザー定義関数の名前。 関数名は識別子のルールに従い、データベースおよびそのスキーマ内で一意でなければなりません。

パラメータを指定していなくても、関数名の後には必ず括弧を付けなければなりません。

@ parameter_name

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

関数は最大2,100個のパラメータを持つことができます。 ユーザーやアプリケーションが関数を呼び出す際、デフォルトが定義されていない限り、宣言された各パラメータの値を提供しなければなりません。

パラメーター名は、最初の文字をアット マーク ( @ ) にして指定します。 パラメータ名は識別子のルールに従う必要があります。 パラメータは関数に局所的であり、同じパラメータ名を他の関数でも使うことができます。 パラメータは定数のみを置き換えることができ、テーブル名やカラム名、他のデータベースオブジェクトの名前の代わりに使うことはできません。

ANSI_WARNINGS ストアドプロシージャ、ユーザー定義関数でパラメータを渡す場合、またはバッチステートメントで変数を宣言して設定する場合は、受け入れられません。 例えば、 変数をchar(3)として定義し、それを3文字より大きい値に設定すると、データは定義されたサイズに切り詰められ、SQL文は成功します。

parameter_data_type

パラメーターのデータ型。 Transact-SQL 関数の場合、サポートされているすべての スカラー データ型 が許可されます。

[ = デフォルト ]

パラメータのデフォルト値。 デフォルト値を定義すれば、そのパラメータの値を指定せずに関数を実行できます。

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

return_data_type

スカラーユーザー定義関数の戻り値。

Fabric Data Warehouse の関数の場合、 rowversion/timestamp を除くすべてのデータ型が許可されます。 テーブルのような非スカラータイプは許可されていません。

function_body

一連の Transact-SQL ステートメント。

スカラー関数では、 function_body はスカラー値に評価される一連の Transact-SQL ステートメントであり、次のような場合があります。

  • 単一ステートメント式
  • 複数ステートメント式 (IF/THEN/ELSE および BEGIN/END ブロック)
  • ローカル変数
  • 使用可能な組み込み SQL 関数の呼び出し
  • 他の UDF の呼び出し
  • SELECT ステートメント、およびテーブル、ビュー、インライン テーブル値関数への参照
  • 制御フロー文(WHILE ループ、 RETURNS)

scalar_expression

スカラー関数が返すスカラー値を指定します。

select_stmt

インライン テーブル値関数の戻り値を定義する単一の SELECT ステートメント。 インラインテーブル値関数には関数本体が存在しません。テーブルは単一の SELECT 文の結果集合です。

TABLE

テーブル値関数 (TVF) の戻り値がテーブルになるように指定します。 定数と@local_variables をTVFに渡すことはできません。

インラインTVF(プレビュー)では、 TABLE リターン値を単一の SELECT 文で定義します。 インライン関数には、戻り値の変数が関連付けられていません。

<function_option>

Fabric Data Warehouseでは、INLINEENCRYPTIONEXECUTE ASキーワードはサポートされていません。

サポートされる機能オプションには以下が含まれます:

SCHEMABINDING

参照するデータベース オブジェクトに対して、その関数がバインドされるように指定します。 SCHEMABINDINGを指定すると、ビューやテーブルなどの基礎オブジェクトを関数定義に影響を与えるような変更はできません。 まず、修正したいオブジェクトへの依存関係を取り除くために関数の定義を修正または削除する必要があります。

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

  • 関数をやめてみろ。

  • 関数文を ALTER し、 SCHEMABINDING オプションを削除します。

関数をスキーマバインドできるのは、以下の条件が成り立たない場合のみです:

  • 関数が参照するユーザー定義関数もスキーマに縛られています。

  • この関数は二つの部分名を使ってオブジェクトを参照します。

  • UDFの本体内では、組み込み関数と同じデータベース内の他のUDFのみを参照できます。

  • CREATE FUNCTION文を実行するユーザーは、関数が参照するデータベースオブジェクトに対してREFERENCES権限を持ちます。

SCHEMABINDING を削除するには、 ALTERを使用します。

NULL 入力で NULL を返す | NULL 入力で呼び出される

スカラー値関数の OnNULLCall 属性を指定します。 この属性を指定しなければ、 CALLED ON NULL INPUT はデフォルトで暗黙として示されており、 NULL が引数として渡されても関数の本体は実行されます。

ベスト プラクティス

  • ユーザー定義関数をスキーマバインディングで作成しない場合、基礎となるオブジェクトの変更が関数の定義に影響を与え、関数を呼び出した際に予期せぬ結果を引き起こすことがあります。 関数を作成する際に WITH SCHEMABINDING を指定することで、後から基となるオブジェクトの変更が関数の挙動を変えたり壊したりしないようにします。

  • ユーザー定義関数をインライン化するように書きましょう。 詳細については、「スカラー UDF のインライン化」を参照してください。

相互運用性

インライン テーブル値ユーザー定義関数

インラインテーブル値関数は単一の SELECT 文のみを受け付けます。

スカラー ユーザー定義関数

  • スカラー値関数で有効なステートメントは以下のとおりです。

    • 代入ステートメント
    • control-of-Flow ステートメント ( TRY...CATCH ステートメントを除く)
    • DECLARE ローカル データ変数を定義するステートメント
  • 次の組み込み関数は、スカラー値関数本体ではサポートされていません。

  • 次の場合、ユーザー テーブルの SELECT ... FROM クエリではスカラー UDF を使用できません。

    • UDFの本体には、 GETDATE()のような非決定性組み込み関数への呼び出しが含まれています。詳細は 決定論的関数および非決定性関数を参照してください。
    • UDFの本文には BREAK または CONTINUE 文が含まれています。
    • 再帰スカラーのUDF呼び出しがあります。
  • スカラーUDFは、以下の場合、CTEや GROUP BYなどすべてのクエリ形状で使用できません。

    • スカラーUDFは、これらのデータ型のいずれかを入力パラメータ、ローカル変数、または返却データ型として含みます:varchar(max)、nvarchar(max)、varbinary(max)、binary(max))。
    • スカラーUDFボディには他のスカラーUDFへの呼び出しが含まれています。
    • スカラーUDFボディはテーブル/ビュー/iTVFへの参照を含みます。

詳細については、「 スカラー UDF のインライン化の要件」を参照してください。

  • スカラーUDFに以下のいずれかが含まれている場合、1つのクエリで10回以上のUDF呼び出しが行われるとユーザークエリは失敗する可能性があります。 エッジ ケースによっては、ユーザー クエリと UDF 本文の複雑さがインライン化を妨げる場合があります。その場合、スカラー UDF はインライン化されず、ユーザー クエリは失敗します。

    • スカラーUDFは、これらのデータ型のいずれかを入力パラメータ、ローカル変数、または返却データ型として含みます:varchar(max)、nvarchar(max)、varbinary(max)、binary(max))。
    • スカラーUDFボディには他のスカラーUDFへの呼び出しが含まれています。
    • スカラーUDFボディはテーブル/ビュー/iTVFへの参照を含みます。
  • サポートされていないシナリオでスカラー UDF を使用すると、"Scalar UDF execution is currently unavailable in this context." というエラー メッセージが表示されます

制限事項

現在のプレビュー期間中は、制限事項が変更される可能性があります。

ユーザー定義関数を使ってデータベースの状態を変更するアクションを行うことはできません。

ユーザー定義関数をネストすることも可能です。 つまり、1 つのユーザー定義関数が別の関数を呼び出すことができます。 呼び出し関数が実行を開始するとネスティングレベルは増加し、呼び出しされた関数が実行を終了すると減少します。 Fabric Data Warehouseでは、UDFのボディがテーブル、ビュー、またはインラインのテーブル値関数を参照する場合、ユーザー定義関数を最大4レベル、それ以外は最大32レベルまでネストできます。 最大ネストレベルを超えると、呼び出し関数チェーンは失敗します。

メタデータ

このセクションでは、ユーザー定義関数に関するメタデータを返すために使用できるシステム カタログ ビューを示します。

  • sys.sql_modules:Transact-SQL ユーザー定義関数の定義やインライン性情報を表示します。 次に例を示します。

     SELECT 
         SCHEMA_NAME(o.schema_id) AS SchemaName,
         o.name AS FunctionName,
         m.definition AS FunctionDefinition,
         m.is_inlineable AS Inlineable,
         m.inline_eligibility_mask AS InlineEligibilityMask
     FROM sys.objects o
     JOIN sys.sql_modules m ON o.object_id = m.object_id
     WHERE o.type = 'FN';
    
  • sys.parameters: ユーザー定義関数で定義されているパラメーターに関する情報を表示します。

  • sys.sql_expression_dependencies: 関数によって参照される基になるオブジェクトを表示します。

アクセス許可

Fabric ワークスペース管理者ロール、メンバー ロール、および共同作成者ロールのメンバーは、関数を作成できます。

スカラー UDF のインライン化

Microsoft Fabric Data Warehouseは、ユーザー定義コードを分散的にコンパイル・実行するために異なるインライン技術を用いています。

スカラーUDFのインライイングはデフォルトで有効です。

一部の T-SQL 構文では、スカラー UDF を非インライン化できます。 例えば、 WHILE ループの組み合わせとUDFボディ内のテーブルを参照する関数はインライン化できません。 詳細については、「 スカラー UDF のインライン化の要件」を参照してください。

スカラー UDF をインライン化できるかどうかを確認する

sys.sql_modules カタログ ビューには、UDF がインライン化可能かどうかを示す列is_inlineableが含まれています。 is_inlineableプロパティはUDF定義内の構文を確認することから得られます。 スカラーUDFはコンパイル時までにインライン化されていません。

inline_eligibility_maskプロパティは、UDFに適用されるインラインの種類を説明しています。

  • 0の値はUDFが一線化できないことを意味します。
  • 1の値は、UDFがスカラーUDFインラインの対象であることを示します。
  • 値が 2 の場合は、UDFがエクスプレッションブロックによるインラインングの対象となります。
  • 値が 3 の場合は、UDFがいずれのインライン技術にも適用可能であることを示します。

スカラーUDFがインライン可能であれば、クエリがコンパイルされる際に必ずしもインラインであるとは限りません。

Fabric Data Warehouse(クエリごとに)どのインライン技術を適用するかを決定します。

次のサンプル クエリを使用して、スカラー UDF がインライン化可能かどうかを確認します。

SELECT 
SCHEMA_NAME(b.schema_id) as function_schema_name,
    b.name as function_name,
       b.type_desc as function_type,
       a.is_inlineable
FROM sys.sql_modules AS a
     INNER JOIN sys.objects AS b
         ON a.object_id = b.object_id
WHERE b.type IN ('FN');

もしスカラー関数が sys.sql_modules.is_inlineableインラインでない場合でも、例えば変数を設定するために単独の呼び出しとしてクエリを実行することは可能です。 しかし、スカラー関数はユーザーテーブルの SELECT ... FROM クエリの一部にはなりません。 次に例を示します。

CREATE FUNCTION [dbo].[custom_SYSUTCDATETIME]()
  RETURNS datetime2(6)
  AS
  BEGIN
   RETURN SYSUTCDATETIME();
  END

サンプル dbo.custom_SYSUTCDATETIME スカラーユーザー定義関数は、非決定式システム関数のため線形にできません SYSUTCDATETIME()。 ユーザーテーブルの SELECT ... FROM クエリでは失敗しますが、単独呼び出しとしては成功します。 次に例を示します。

DECLARE @utcdate datetime2(7);
SET @utcdate = dbo.custom_SYSUTCDATETIME();
SELECT @utcdate as 'utc_date';

例示

A。 インライン テーブル値関数を作成する

以下の例は、モジュールのキー情報を返すインラインテーブル値関数を作成し、 objectType パラメータでフィルタリングします。 DEFAULTパラメータで関数を呼び出すと、すべてのモジュールを返すデフォルトの数値が含まれています。 この例では メタデータで言及されているシステムカタログビューの一部を使用しています。

CREATE FUNCTION dbo.ModulesByType (@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN (
        SELECT sm.object_id AS 'Object Id',
            o.create_date AS 'Date Created',
            OBJECT_NAME(sm.object_id) AS 'Name',
            o.type AS 'Type',
            o.type_desc AS 'Type Description',
            sm.DEFINITION AS 'Module Description',
            sm.is_inlineable AS 'Inlineable'
        FROM sys.sql_modules AS sm
        INNER JOIN sys.objects AS o ON sm.object_id = o.object_id
        WHERE o.type LIKE '%' + @objectType + '%'
        );
GO

すべてのインラインテーブル値関数を返す関数を呼び出します(IF):

SELECT * FROM dbo.ModulesByType('IF'); -- SQL_INLINE_TABLE_VALUED_FUNCTION

または、すべてのスカラー関数 (FN) を見つけます。

SELECT * FROM dbo.ModulesByType('FN'); -- SQL_SCALAR_FUNCTION

B. インライン テーブル値関数の結果を結合する

この簡単な例は、以前に作成したインラインTVFを使って、 CROSS APPLYを使って他のテーブルと結果を組み合わせる方法を示しています。 ここでは、 sys.objectsModulesByType の結果の両方から、 type 列に一致するすべての行の列を選択します。 APPLYの使用についての詳細は、FROM節とJOIN、APPLY、PIVOT(Transact-SQL)を参照してください。

SELECT * 
FROM sys.objects AS o
CROSS APPLY dbo.ModulesByType(o.type);
GO

C. スカラー UDF 関数を作成する

次の例では、入力テキストをマスクするインライン可能なスカラー UDF を作成します。

CREATE OR ALTER FUNCTION [dbo].[cleanInput] (@InputString VARCHAR(100))
    RETURNS VARCHAR(50)
    AS
    BEGIN
        DECLARE @Result VARCHAR(50)
        DECLARE @CleanedInput VARCHAR(50)

        -- Trim whitespace
        SET @CleanedInput = LTRIM(RTRIM(@InputString))

        -- Handle empty or null input
        IF @CleanedInput = '' OR @CleanedInput IS NULL
        BEGIN
            SET @Result = ''
        END
        ELSE IF LEN(@CleanedInput) <= 2
        BEGIN
            -- If string length is 1 or 2, just return the cleaned string
            SET @Result = @CleanedInput
        END
        ELSE
        BEGIN
            -- Construct the masked string
            SET @Result = 
                LEFT(@CleanedInput, 1) +
                REPLICATE('*', LEN(@CleanedInput) - 2) +
                RIGHT(@CleanedInput, 1)
        END

        RETURN @Result
    END

次のように関数を呼び出すことができます。

DECLARE @input varchar(100) = '123456789'

SELECT dbo.cleanInput (@input) AS function_output;

Fabric Data Warehouse でスカラー UDF を使用する方法のその他の例:

SELECT ステートメントで次の手順を実行します。

SELECT TOP 10 
t.id, t.name, 
dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t;

WHERE句の場合:

 SELECT t.id, t.name, dbo.cleanInput(t.name) AS function_output
FROM dbo.MyTable AS t
WHERE dbo.cleanInput(t.name)='myvalue'

JOIN句の場合:

SELECT t1.id, t1.name, 
     dbo.cleanInput (t1.name) AS function_output, 
     dbo.cleanInput (t2.name) AS function_output_2
FROM dbo.MyTable1 AS t1
    INNER JOIN dbo.MyTable2 AS t2 
        ON dbo.cleanInput(t1.name)=dbo.cleanInput(t2.name);

ORDER BY句の場合:

SELECT  t.id, t.name, dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t
ORDER BY function_output;

INSERTUPDATEDELETEなどのデータ操作言語 (DML) ステートメントの場合:

SELECT t.id, t.name, dbo.cleanInput (t.name) AS function_output 
INTO dbo.MyTable_new
FROM dbo.MyTable AS t;

UPDATE t
SET t.mycolumn_new = dbo.cleanInput (t.name)
FROM dbo.MyTable AS t;

DELETE t
FROM dbo.MyTable AS t
WHERE dbo.cleanInput (t.name) ='myvalue';

適用対象:Azure Synapse AnalyticsAnalytics Platform System (PDW)

Azure Synapse Analytics または Analytics Platform System (PDW) でユーザー定義関数 (UDF) を作成します。 ユーザー定義の関数は、パラメーターを受け取り、複雑な計算などの操作を実行する Transact-SQL ルーチンであり、そのアクションの結果を値として返します。 ユーザー定義テーブル値関数 (TVF) は、table データ型を返します。

ヒント

Fabric Data Warehouseの構文については、Fabric Data WarehouseのCREATE FUNCTIONバージョンを参照してください。

  • Analytics Platform System (PDW) では、戻り値はスカラー (単一) 値である必要があります。

  • Azure Synapse Analytics では、 CREATE FUNCTION はインライン テーブル値関数の構文 (プレビュー) を使用してテーブルを返すか、スカラー関数の構文を使用して 1 つの値を返すことができます。

  • Azure Synapse Analytics のサーバーレス SQL プールでは、 CREATE FUNCTION はインライン テーブル値関数を作成できますが、スカラー関数は作成できません。

    この文を使って、以下の方法で使える再利用可能なルーチンを作成します:

  • Transact-SQL ステートメントでは、次のような SELECT

  • 関数を呼び出すアプリケーションの場合

  • 別のユーザー定義関数の定義内で使用する

  • 列の CHECK 制約を定義する

  • ストアド プロシージャを置換する

  • セキュリティ ポリシーのフィルター述語としてのインライン関数を使用します。

Transact-SQL 構文表記規則

構文

スカラー関数の構文

-- Transact-SQL Scalar Function Syntax (in dedicated pools in Azure Synapse Analytics and Parallel Data Warehouse)
-- Not available in the serverless SQL pools in Azure Synapse Analytics

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

<function_option>::=   
{  
    [ SCHEMABINDING ]  
  | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]  
}  

インライン テーブル値関数の構文

-- Transact-SQL Inline Table-Valued Function Syntax
-- Preview in dedicated SQL pools in Azure Synapse Analytics
-- Available in the serverless SQL pools in Azure Synapse Analytics
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
    [ = default ] }
    [ ,...n ]
  ]
)
RETURNS TABLE
    [ WITH SCHEMABINDING ]
    [ AS ]
    RETURN [ ( ] select_stmt [ ) ]
[ ; ]

引数

schema_name

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

function_name

ユーザー定義関数の名前。 関数名は識別子のルールに従い、データベースおよびそのスキーマ内で一意でなければなりません。

パラメータを指定していなくても、関数名の後には必ず括弧を付けなければなりません。

@ parameter_name

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

関数は最大2,100個のパラメータを持つことができます。 ユーザーやアプリケーションが関数を呼び出す際、デフォルトが定義されていない限り、宣言された各パラメータの値を提供しなければなりません。

パラメーター名は、最初の文字をアット マーク ( @ ) にして指定します。 パラメータ名は識別子のルールに従う必要があります。 パラメータは関数に局所的であり、同じパラメータ名を他の関数でも使うことができます。 パラメータは定数のみを置き換えることができ、テーブル名やカラム名、他のデータベースオブジェクトの名前の代わりに使うことはできません。

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

parameter_data_type

パラメーターのデータ型。 Transact-SQL 関数は、Azure Synapse Analytics でサポートされるすべてのスカラー データ型を許可します。 タイムスタンプ(rowversion)のデータ型はサポートされていません。

[ = デフォルト ]

パラメータのデフォルト値。 デフォルト値を定義すれば、そのパラメータの値を指定せずに関数を実行できます。

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

return_data_type

スカラーユーザー定義関数の戻り値。 Transact-SQL 関数は、Azure Synapse Analytics でサポートされるすべてのスカラー データ型を許可します。 rowversion/timestampのデータ型はサポートされていません。 カーソル型やテーブル型のノンスカラー型は許可されていません。

function_body

一連の Transact-SQL ステートメント。 function_bodySELECT文を含めず、データベースデータを参照することもできません。 function_bodyはテーブルやビューを参照できません。 関数本体は他の決定論的関数を呼び出すことはできますが、非決定性関数は呼び出すことはできません。

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

scalar_expression

スカラー関数が返すスカラー値を指定します。

select_stmt

インライン テーブル値関数の戻り値を定義する単一の SELECT ステートメント。 インラインテーブル値関数には関数本体が存在しません。テーブルは単一の SELECT 文の結果集合です。

TABLE

テーブル値関数 (TVF) の戻り値がテーブルになるように指定します。 定数と@local_variables をTVFに渡すことはできません。

インラインTVF(プレビュー)では、 TABLE リターン値を単一の SELECT 文で定義します。 インライン関数には、戻り値の変数が関連付けられていません。

<function_option>

関数に次のオプションの 1 つ以上があることを指定します。

SCHEMABINDING

参照するデータベース オブジェクトに対して、その関数がバインドされるように指定します。 SCHEMABINDINGを指定すると、ビューやテーブルなどの基礎オブジェクトを関数定義に影響を与えるような変更はできません。 まず、修正したいオブジェクトへの依存関係を取り除くために関数の定義を修正または削除する必要があります。

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

  • 関数をやめてみろ。

  • 関数文を ALTER し、 SCHEMABINDING オプションを削除します。

関数をスキーマバインドできるのは、以下の条件が成り立たない場合のみです:

  • 関数が参照するユーザー定義関数もスキーマに縛られています。

  • 関数参照は1部または2部の名称を使用します。

  • UDFの本体内では、組み込み関数と同じデータベース内の他のUDFのみを参照できます。

  • CREATE FUNCTION文を実行するユーザーは、関数が参照するデータベースオブジェクトに対してREFERENCES権限を持ちます。

SCHEMABINDING を削除するには、 ALTERを使用します。

NULL 入力で NULL を返す | NULL 入力で呼び出される

スカラー値関数の OnNULLCall 属性を指定します。 この属性を指定しなければ、 CALLED ON NULL INPUT はデフォルトで暗黙として示されており、 NULL が引数として渡されても関数の本体は実行されます。

ベスト プラクティス

SCHEMABINDING節でユーザー定義関数を作成していない場合、基礎オブジェクトの変更が関数の定義に影響を与え、呼び出し時に予期せぬ結果を引き起こすことがあります。 関数を作成する際に WITH SCHEMABINDING 節を指定します。 この節により、関数定義で参照されているオブジェクトを修正しない限り変更できません。

相互運用性

スカラー値関数で有効なステートメントは以下のとおりです。

  • 代入ステートメント。

  • TRY... 以外のControl-of-Flow文CATCHステートメント。

  • ローカルデータ変数を定義するDECLARE文。

インラインテーブル値関数(プレビュー)では、select文は1つしか使えません。

制限事項

ユーザー定義関数を使ってデータベースの状態を変更するアクションを行うことはできません。

ユーザー定義関数をネストすることも可能です。 あるユーザー定義関数は別の関数を呼び出すことができます。 呼び出し関数が実行を開始するとネスティングレベルは増加し、呼び出しされた関数が実行を終了すると減少します。 最大ネスティングレベルを超えると、呼び出し関数チェーン全体が失敗します。

サーバーレスSQLプールのmasterデータベースに関数を含むオブジェクトを作成することはできませんAzure Synapse Analytics。

メタデータ

このセクションでは、ユーザー定義関数に関するメタデータを返すために使用できるシステム カタログ ビューを示します。

  • sys.sql_modules: ユーザー定義関数の定義 Transact-SQL 表示します。 次に例を示します。

    SELECT definition, type   
    FROM sys.sql_modules AS m  
    JOIN sys.objects AS o   
        ON m.object_id = o.object_id   
        AND type = ('FN');
    
  • sys.parameters: ユーザー定義関数で定義されているパラメーターに関する情報を表示します。

  • sys.sql_expression_dependencies: 関数によって参照される基になるオブジェクトを表示します。

アクセス許可

データベースでの CREATE FUNCTION 権限と、関数が作成されるスキーマに対するALTER権限が必要です。

例示

A。 スカラー値のユーザー定義関数を使用してデータ型を変更する

この単純な関数は 、int データ型を入力として受け取り、出力として 10進数(10,2) 型を返します。

CREATE FUNCTION dbo.ConvertInput (@MyValueIn int)  
RETURNS decimal(10,2)  
AS  
BEGIN
    DECLARE @MyValueOut int;  
    SET @MyValueOut= CAST( @MyValueIn AS decimal(10,2));  
    RETURN(@MyValueOut);  
END;  
GO  

SELECT dbo.ConvertInput(15) AS 'ConvertedValue';  

スカラー関数はサーバーレスのSQLプールには存在しません。

B. インライン テーブル値関数を作成する

以下の例は、モジュールのキー情報を返すインラインテーブル値関数を作成し、 objectType パラメータでフィルタリングします。 DEFAULTパラメータで関数を呼び出すと、すべてのモジュールを返すデフォルトの数値が含まれています。 この例では メタデータで言及されているシステムカタログビューの一部を使用しています。

CREATE FUNCTION dbo.ModulesByType(@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN
(
    SELECT 
        sm.object_id AS 'Object Id',
        o.create_date AS 'Date Created',
        OBJECT_NAME(sm.object_id) AS 'Name',
        o.type AS 'Type',
        o.type_desc AS 'Type Description', 
        sm.definition AS 'Module Description'
    FROM sys.sql_modules AS sm  
    JOIN sys.objects AS o ON sm.object_id = o.object_id
    WHERE o.type like '%' + @objectType + '%'
);
GO

以下のような関数で、すべてのビュー(V)オブジェクトを返すことができます:

select * from dbo.ModulesByType('V');

インラインテーブル値関数はサーバーレスのSQLプールで利用可能ですが、専用のSQLプールではプレビュー段階です。

C. インライン テーブル値関数の結果を結合する

この簡単な例は、以前に作成したインラインTVFを使って、 CROSS APPLYを使って他のテーブルと結果を組み合わせる方法を示しています。 この例では、 sys.objectsModulesByType の結果の両方から、 type 列に一致するすべての行の列を選択します。 APPLYの使用についての詳細は、FROM節とJOIN、APPLY、PIVOT(Transact-SQL)を参照してください。

SELECT * 
FROM sys.objects o
CROSS APPLY dbo.ModulesByType(o.type);
GO

インラインテーブル値関数はサーバーレスのSQLプールで利用可能ですが、専用のSQLプールではプレビュー段階です。

次のステップ