sql >> データベース >  >> RDS >> Sqlserver

いつテーブル値関数を使用しますか?

    テーブル値関数は、「単なる」パラメーター化されたビューです。これにより、不透明なストアドプロシージャの背後に隠されていたロジックをカプセル化するために非常に強力になります。次に例を示します:

    インラインテーブル値関数:

    create function dbo.GetClients (
        @clientName nvarchar(max) = null
    )
    returns table
    return (
        select *
        from dbo.Clients as a
        where ((a.ClientName = @clientName) or a.ClientName is null)
    );
    

    ストアドプロシージャ:

    create procedure dbo.usp_GetClients (
        @clientName nvarchar(max) = null
    )
    as
    begin;
        select *
        from dbo.Clients as a
        where ((a.ClientName = @clientName) or a.ClientName is null)
    end;
    

    ストアドプロシージャの呼び出しとは異なり、テーブル値関数を使用すると、dbo.GetClientsからロジックを作成できます。 他のオブジェクトと:

    select *
    from dbo.GetClients(N'ACME') as a
    join ... as b
        on a.ClientId = b.ClientId
    

    このような状況では、テーブル値関数と比較した場合の制限が大きいため、ストアドプロシージャの使用を想像することはできません。複数のオブジェクトからの結果を組み合わせるために、一時テーブル、テーブル変数、またはアプリケーション層を使用して自分の周りのデータをマーシャリングすることを余儀なくされます。

    インラインテーブル値関数は、おそらくここで最もよく説明されている「インライン」ビットがあるため、特に優れています。これにより、オプティマイザーはカプセル化するオブジェクトと同じようにそのような関数を処理できるため、ほぼ最適なパフォーマンスプランが得られます(インデックスと統計が理想的であると想定)。



    1. nvarcharに改行を正しく挿入する方法

    2. PostgreSQLテーブルの行のカウントを高速化するにはどうすればよいですか?

    3. mysql:2つの日時の間のレコード数を取得します

    4. 行からコンマ区切りの文字列を取得します