19

SQL Server でインライン スカラー関数を作成する正しい構文は何ですか?

Books Onlineの関数の種類の章 (2005 年以降) では、インライン スカラー関数が存在するかのように説明されており、BEGIN...END(複数行の関数とは対照的に) ブロックが必要ないかのように説明されています。

インライン スカラー関数の場合、関数本体はありません。スカラー値は単一ステートメントの結果です。複数ステートメントのスカラー関数の場合、BEGIN...END ブロックで定義される関数本体には、単一の値を返す一連の Transact-SQL ステートメントが含まれます。

また、spt_values テーブルのオブジェクト タイプのリストに「IS: inline scalar function」の行があることにも気付きました。

SELECT name
FROM master..spt_values
WHERE type = 'O9T'
AND name LIKE '%function%'

そのような関数を作成しようとしましたが、成功しませんでした:

CREATE FUNCTION AddOne(@n int) RETURNS int
AS
    RETURN @n + 1

エラーメッセージは

メッセージ 102、レベル 15、状態 31、プロシージャ AddOne、行 3 'RETURN' 付近の構文が正しくありません。

オンライン ブックに何か不足していますか、それともエラーがありますか?

4

4 に答える 4

11

まあ、私の知る限り、(非表示の [ mssqlsystemresource ] データベースにも) 何も存在せず、それを作成するための構文もありません。したがって、これは Microsoft が SQL Server 2005 の準備段階で型を追加 (およびドキュメント!) することで予期していたに違いないが、何らかの理由で実際には実装されていないようです。

これは、すべての Msql サーバーで最も要求の高い機能の 1 つです。主な理由は、デフォルトの UDF が非常に遅く、同じ効果を得るために ITVF をバックエンドにする必要があるからです。(難しくて不器用ですが、うまくいきます)。

于 2012-05-03T14:53:36.273 に答える
4

正解です。インライン スカラー関数などというものはありません。インライン TVF を使用して「シミュレート」できますが、「クライアント」の構文を変更する必要があります。1) 関数を作成します。

    create function dbo.AddOne(@input int) returns table as return (select @input + 1 as value);

2)「クライアント」コードで、これを行います...

    (select value from dbo.AddOne(Column)) as ColumnPlusOne

これで、機能するインライン スカラー関数ができました。

このように見えるクライアント コード内の多くのスカラー UDF を置き換えるために、これを行う必要がありました...

create function dbo.GetLookupID(@code varchar(50)) returns int
as
begin
    declare @return int;
    select @return = LookupID from dbo.Lookups where Code = @code;
    return @return;
end;

変数を削除して修正しようとしました...

create function dbo.GetLookupID(@code varchar(50)) returns int
as
begin
    return (select LookupID from dbo.Lookups where Code = @code);
end;

これは改善されましたが、パフォーマンスには依然として不快な影響がありました。iTVFに変えて呼び出し規約を変えてみたら・・・ずいぶん良くなりました。

于 2018-01-02T18:36:02.483 に答える
1

私は同じことを見ています。その文は「インラインスカラー関数」への唯一の言及のようです。この記事では、インライン テーブル値関数が十分に高速であると主張しています。

于 2012-05-03T14:43:29.023 に答える