2016-08-29 3 views
1

私はSQLを初めて使用しています。安全在庫を計算するこのSQL関数を分析しています。これまでに見たことのないものに遭遇しました。SQL関数内の2つのreturn文は何を意味しますか?

これは小数を返すスカラ関数です。しかし、コードの末尾にはこのように書き:

DECLARE @SafetyStockUnitsCalcNew decimal(14,2) 
RETURN(SELECT 
    STDEV(
    . 
    . 
    Code for calculating Safety Stock goes here. 

     ) 

-- Return the result of the function 
RETURN @SafetyStockUnitsCalcNew 

END

だから何が返されますか?最初のreturn文または2番目のreturn文?最初のものも2番目のスカラー値です。また、@ SafetyStockUnitsCalcNewが宣言されると、返されるまで使用されません。だから私はそれが設定されているか分からない。 STDEV内のコードは@SafetyStockUnitsCalcNewを全く参照しません。すべてのヘルプは高く評価され

はあなたに感謝します。

+3

第2のリターンは決して実行されません。なぜなら、最初のリターンは常に実行されるからです。 –

+1

そのまま動作していますか? – Brad

+0

はい、動作していますが、値を返します。 –

答えて

0

私は、テストサーバーに行く機能を作成し、その第2の戻りをコメントアウトし、何が起こるかを参照してくださいね。私はそれが決して実行されないことを99%確信しています。あなたが望むよう

+0

これは私の意見では答えではないコメントでなければならない – GuidoG

+0

あなたはそれが実行されませんが正しいです。うーん、私は2番目のリターンステートメントをそこに置く目的が何であるのだろうか?それはバグでなければならない –

2

機能は、多くRETURNステートメントを持つことができます。

など。下には3つあります。

制御の流れがreturnステートメントを検出、関数の実行が停止し、値が返されます。 C#で起こるよう

CREATE FUNCTION dbo.Foo(@x int) 
RETURNS INT 
AS 
BEGIN 
IF @x = 1 
    RETURN 10; 
ELSE 
    RETURN 18; 

RETURN 1/0; 
END 

SQL Serverは、すべてのコードパスが値を返すと、到達不能コードを警告することを検出するための分析の同じレベルのような何もしません。最後のステートメントはreturnでなければならないと主張しているだけです。

上記の例では、3番目のRETURN文には到達できませんが、それがなければ "関数内に含まれる最後の文はreturn文でなければなりません"というエラーが表示されます。

あなたの例では、第二RETURNステートメントが到達することはできませんし、それが「最後の文」のルールは必要ありません。どちらかので、それは無用です。おそらくもともとはSELECTが変数に結果を割り当てていて、それをコーディングしている人がSELECTの結果を直接返すことができると認識しました。

+0

非常に良い説明、ありがとう – hellogoodnight

関連する問題