次の方法で共有


CREATE 関数

適用対象:Microsoft Fabric SQL 分析エンドポイントと Warehouse

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

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

Von Bedeutung

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

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

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

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

ヒント

CREATE OR ALTER FUNCTIONを指定して、その名前で新しい関数が存在しない場合は作成するか、1 つのステートメントで既存の関数を変更できます。

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 つ以上のパラメーターを宣言できます。

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

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

ANSI_WARNINGS は、ストアド プロシージャ、ユーザー定義関数でパラメーターを渡す場合、またはバッチ ステートメントで変数を宣言して設定する場合には適用されません。 たとえば、変数を char(3) と定義し、これに 4 文字以上の値を設定すると、データが定義されたサイズに合わせて切り捨てられてから、INSERT または UPDATE ステートメントが成功します。

parameter_data_type

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

[ = デフォルト ]

パラメータのデフォルト値。 default 値が定義されている場合は、パラメーターに値を指定せずに関数を実行できます。

関数のパラメータにデフォルト値がある場合、デフォルト値を取得するために関数を呼び出すときにキーワード 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 ステートメント、およびテーブル、ビュー、インライン テーブル値関数への参照

scalar_expression

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

select_stmt

インライン テーブル値関数の戻り値を定義する単一の SELECT ステートメント。 インライン テーブル値関数の場合、関数本体はありません。テーブルは、単一の SELECT ステートメントの結果セットです。

テーブル

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

インライン TVF (プレビュー) では、TABLE 戻り値は 1 つの SELECT ステートメントを使用して定義されます。 インライン関数には、関連付けられている戻り変数はありません。

<function_option>

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

サポートされる関数オプションは次のとおりです。

SCHEMABINDING

参照するデータベース オブジェクトに対して、その関数がバインドされるように指定します。 SCHEMABINDING を指定した場合、ベース オブジェクトに対して関数定義に影響を与えるような変更は行えません。 まず関数定義を変更または削除して、変更するオブジェクトとの依存関係を解消する必要があります。

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

  • 関数を削除した場合。

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

関数をスキーマにバインドできるのは、次の条件が満たされている場合に限られます。

  • 関数によって参照されているすべてのユーザー定義関数もスキーマにバインドします。

  • 関数によって参照されるオブジェクトは、2 つの部分からなる名前を使用して参照されます。

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

  • CREATE FUNCTION ステートメントを実行したユーザーには、関数が参照するデータベース オブジェクトに対する REFERENCES 権限があります。

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

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

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

ベスト プラクティス

  • スキーマ バインドを使用してユーザー定義関数が作成されていない場合、基になるオブジェクトに加えられた変更が関数の定義に影響し、呼び出されたときに予期しない結果が生成される可能性があります。 関数を作成するときは、 WITH SCHEMABINDING 句を指定することをお勧めします。 これにより、関数定義で参照されているオブジェクトは、一緒に関数も変更しない限り変更できなくなります。

  • インライン化可能なユーザー定義関数を記述する。 詳細については、「スカラー UDF のインライン化」を参照してください。

相互運用性

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

インライン テーブル値関数では、1 つの select ステートメントのみが許可されます。

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

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

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

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

  • スカラー UDF は、次の場合にクエリで使用できません。

    • UDF は、 GROUP BY 句で直接呼び出されます。
    • UDF は、 ORDER BY clause で直接呼び出されます。
    • 呼び出し元クエリには共通 のテーブル式 (CTE) があります
  • 再帰スカラー UDF はサポートされていません。

  • 1 つのクエリで 10 を超える UDF 呼び出しが行われた場合、ユーザー クエリは失敗する可能性があります。

  • エッジ ケースによっては、ユーザー クエリと UDF 本文の複雑さがインライン化を妨げる場合があります。その場合、スカラー UDF はインライン化されず、ユーザー クエリは失敗します。

  • サポートされていないシナリオでスカラー UDF を使用すると、"Scalar UDF execution is currently unavailable in this context." というエラー メッセージが表示されます

制限事項

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

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

ユーザー定義関数は入れ子にすることができます。つまり、1 つのユーザー定義関数で、別のユーザー定義関数を呼び出すことができます。 呼び出された関数が実行を開始すると入れ子レベルが 1 つ上がり、呼び出された関数が実行を終了するとレベルが 1 つ下がります。 FABRIC Data Warehouse のユーザー定義関数は、UDF 本体がテーブル/ビュー/インライン テーブル値関数を参照する場合は最大 4 レベル、それ以外の場合は最大 32 レベルの入れ子にすることができます。 入れ子の最大レベルを超えると、呼び出し元の関数チェーンが失敗します。

メタデータ

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

  • 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: 関数によって参照される基になるオブジェクトを表示します。

アクセス許可

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

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

Microsoft Fabric Data Warehouse では 、スカラー UDF インライン化を 使用して、ユーザー定義コードを分散方式でコンパイルおよび実行します。 スカラー UDF のインライン化は、既定で有効になっています。

スカラー UDF インライン化は、Microsoft SQL Server 2019 (15.0) で最初に導入されたパフォーマンス最適化手法ですが、Fabric Data Warehouse では、サポートされている一連のシナリオを決定します。 Fabric Data Warehouse では、スカラー UDF は自動的にスカラー式またはスカラー サブクエリに変換され、UDF 演算子の代わりに呼び出し元のクエリで置き換えられます。

一部の T-SQL 構文では、スカラー UDF を非インライン化できます。 WHILE ループ、複数のRETURN ステートメント、または非決定的 SQL 組み込み関数 (GETUTCDATE()GETDATE()など) の呼び出しを含む関数はインライン化できません。 詳細については、「 スカラー UDF のインライン化の要件」を参照してください。

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

sys.sql_modules カタログ ビューには、UDF がインライン化可能かどうかを示す列is_inlineableが含まれています。

is_inlineable プロパティは、UDF 定義内の構文のチェックから派生します。 スカラー UDF は、コンパイル時の前にインライン化されません。 1の値は UDF がインライン可能であることを示し、0の値はインライン化不可能であることを示します。 スカラー UDF がインライン化可能な場合、クエリのコンパイル時に常にインライン化されるとは限りません。

Fabric Data Warehouse は、全体的なクエリの複雑さに応じて、UDF をインライン化するかどうかを (クエリごとに) 決定します。

次のサンプル クエリを使用して、スカラー 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 を使用し、クロス適用によって結果を他のテーブルと結合する方法を示したものです。 ここでは、type列に一致するすべての行について、sys.objectsModulesByTypeの結果の両方からすべての列を選択します。 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 データ型を返します。

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

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

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

    このステートメントを使用して、次の方法で使用できる再利用可能なルーチンを作成します。

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

  • 関数を呼び出すアプリケーション内で使用する

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

  • 列の CHECK 制約を定義する

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

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

ヒント

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

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 つ以上のパラメーターを宣言できます。

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

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

ANSI_WARNINGS は、ストアド プロシージャ、ユーザー定義関数でパラメーターを渡す場合、またはバッチ ステートメントで変数を宣言して設定する場合には適用されません。 たとえば、変数を char(3) と定義し、これに 4 文字以上の値を設定すると、データが定義されたサイズに合わせて切り捨てられてから、INSERT または UPDATE ステートメントが成功します。

parameter_data_type

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

[ = デフォルト ]

パラメータのデフォルト値。 default 値が定義されている場合は、パラメーターに値を指定せずに関数を実行できます。

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

return_data_type

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

function_body

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

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

scalar_expression

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

select_stmt

インライン テーブル値関数の戻り値を定義する単一の SELECT ステートメント。 インライン テーブル値関数の場合、関数本体はありません。テーブルは、単一の SELECT ステートメントの結果セットです。

テーブル

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

インライン TVF (プレビュー) では、TABLE 戻り値は 1 つの SELECT ステートメントを使用して定義されます。 インライン関数には、関連付けられている戻り変数はありません。

<function_option>

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

SCHEMABINDING

参照するデータベース オブジェクトに対して、その関数がバインドされるように指定します。 SCHEMABINDING を指定した場合、ベース オブジェクトに対して関数定義に影響を与えるような変更は行えません。 まず関数定義を変更または削除して、変更するオブジェクトとの依存関係を解消する必要があります。

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

  • 関数を削除した場合。

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

関数をスキーマにバインドできるのは、次の条件が満たされている場合に限られます。

  • 関数によって参照されているすべてのユーザー定義関数もスキーマにバインドします。

  • 関数と関数によって参照されるその他の UDF は、1 つのパーツまたは 2 つのパーツの名前を使用して参照されます。

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

  • CREATE FUNCTION ステートメントを実行したユーザーには、関数が参照するデータベース オブジェクトに対する REFERENCES 権限があります。

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

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

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

ベスト プラクティス

ユーザー定義関数が SCHEMABINDING 句を使って作成されていない場合、基になるオブジェクトに行った変更は関数の定義に影響し、呼び出されたときに予期しない結果が生じる可能性があります。 関数を作成するときは、 WITH SCHEMABINDING 句を指定することをお勧めします。 これにより、関数定義で参照されているオブジェクトは、一緒に関数も変更しない限り変更できなくなります。

相互運用性

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

  • 代入ステートメント。

  • TRY...CATCH ステートメント以外の流れ制御ステートメント。

  • ローカル データ変数を定義する DECLARE ステートメント。

インライン テーブル値関数 (プレビュー) では、select ステートメントを 1 つだけ使用できます。

制限事項

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

ユーザー定義関数は入れ子にすることができます。つまり、1 つのユーザー定義関数で、別のユーザー定義関数を呼び出すことができます。 呼び出された関数が実行を開始すると入れ子レベルが 1 つ上がり、呼び出された関数が実行を終了するとレベルが 1 つ下がります。 入れ子レベルが最大値を超えると、関数チェーン全体の呼び出しが失敗します。 Microsoft Fabric Data Warehouse では、ユーザー定義関数を最大 5 つのレベルに入れ子にすることができます。

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

メタデータ

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

  • 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 データ型として入力を取り、decimal(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 を使用し、クロス適用によって結果を他のテーブルと結合する方法を示したものです。 ここでは、type列に一致するすべての行について、sys.objectsModulesByTypeの結果の両方からすべての列を選択します。 apply の使用方法の詳細については、 FROM 句と JOIN、APPLY、PIVOT (Transact-SQL) を参照してください。

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

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

次のステップ