web-dev-qa-db-ja.com

私の関数は非決定論的なものですか

私には2つの関数があります:fn_Without_Paramfn_With_Param

 CREATE FUNCTION [dbo].[fn_Without_Param]
 (
 )
 ...
 INNER JOIN .. ON .. AND SubmitDate = CONVERT( varchar(10), GETUTCDATE(), 101 )

そして

/*
     I am requesting it so:
    declare @SubmitDate     datetime
    set @SubmitDate = CONVERT( varchar(10), GETUTCDATE(), 101 )
    select * from [dbo].[fn_With_Param] (@SubmitDate)
*/



CREATE FUNCTION [dbo].[fn_With_Param]
(
    @SubmitDate datetime    
)
...
INNER JOIN .. ON .. AND SubmitDate = @SubmitDate  

最初のケースでは、非決定論的(?)関数(GETUTCDATEのため)があり、同じ入力パラメーター(CONVERT(varchar(10)、GETUTCDATE()、101)で2番目の関数を呼び出しました-今日の日付を時間、分なしで意味します、秒、ミリ秒)。私の関数は非決定論的なものですか?これを検出する方法、多分SQLサーバーはいくつかのパブリックマークを持っています。 2番目の関数が遅いのはなぜですか?

6
garik

フラグがあるかどうかはわかりませんが、 http://msdn.Microsoft.com/en-us/library/ms178091.aspx に参照があり、その組み込み関数は次のとおりです。決定論的。

GETDATE()とGETUTCDATE()は、同じパラメーター(この場合はnone)を使用して複数回呼び出すと、異なる値を取得するため、非決定的です。つまり、戻り値は入力によって決定されません。

2番目が最初より遅い理由については、SubmitDate = @ SubmitDate間の暗黙的な変換を確認してください。どちらも日時ですか?