2012-05-03 4 views
16

SQL Serverのインラインスカラー関数を作成する正しい構文は何ですか? Types of Functions章(2005年まで)、インラインスカラー関数についての会談でインラインスカラ関数:実数型またはベーパウェア型?

オンラインブックは、何BEGIN...ENDブロックは(複数行の機能とは対照的に)必要とされないかのように、彼らは存在しているかのように:

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

私もの行に気づいた「IS:インラインスカラー関数」 spt_valuesテーブルのオブジェクト・タイプのリストに:

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'の近く。

書籍オンラインに何か不足しているか、またはエラーがありますか?

+0

CREATE FUNCTIONのBOLと、参照したリンクが、BEGIN..ENDブロックを必要としないことを意味していません。私はあなたが何かを読んでいないと思う。 –

+0

明確にするために、私は 'FN'や 'TF'ではなく、 'IS'型の関数を作りたいと思っています。 –

+0

「インラインスカラー関数の場合、関数本体はありません」という意味は何ですか? –

答えて

8

まあ、AFAIKは存在しません(隠された[mssqlsystemresource]データベースにもありません)、構文を作成する構文はありません。だから、これは、MicrosoftがSQL Server 2005への立ち上げ時に予想していたはずのもので、何らかの理由で実際に実装されたことがないようです。

Ms Sql Serverのすべてで最も要求の多い機能の1つですが、主に、デフォルトのUDFが非常に遅いため、同じ効果を得るためにITVFをバックエンドする必要があります。 (難しくて不器用ですが、機能します)。

+2

ほとんどの場合、http://www.vldb.org/pvldb/vol11/p432-ramachandraのように見えます。 pdf –

+1

@MartinSmith WOW!そこで、インラインスカラー関数を実装するのではなく、すべての*スカラー関数を修正することにしましたか?私は認めなければならないが、それはすごく聞こえるが、安くて簡単な暫定的な選択肢としてインラインを私たちに与えてくれたようだ。 – RBarryYoung

1

私は同じことを見ています。その文は「インラインスカラー関数」への唯一の参照と思われる。 This articleは、インラインテーブル値関数がジョブを実行するのに十分速いと主張しています。

1

正しいですが、インラインスカラー関数はありません。インライン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に変更して呼び出し規約を変更したとき、それははるかに良くなった。

関連する問題