Ist meine Funktion nicht deterministisch
-
16-10-2019 - |
Frage
Ich habe zwei Funktionen: fn_without_param und fn_with_param
CREATE FUNCTION [dbo].[fn_Without_Param]
(
)
...
INNER JOIN .. ON .. AND SubmitDate = CONVERT( varchar(10), GETUTCDATE(), 101 )
und
/*
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
Im ersten Fall habe ich nicht deterministische (?) Funktionen (wegen Getutcdate) und ich habe den zweiten mit demselben Eingangsparameter (konvertieren , Sekunden, Millisekunde). Ist meine Funktion nicht deterministisch? So erkennt man dies, vielleicht hat SQL Server eine öffentliche Marke. Warum ist die zweite Funktion langsamer?
Lösung
Ich bin mir nicht sicher, ob es eine Flagge gibt, aber es gibt eine Referenz bei http://msdn.microsoft.com/en-us/library/ms178091.aspx von denen eingebaute Funktionen deterministisch sind.
GetDate () und getutcdate () sind nicht deterministisch, da Sie sie mehrmals mit denselben Parametern aufrufen, was in diesem Fall keine Werte erhalten. Mit anderen Worten, der Rückgabewert wird nicht durch Eingabe bestimmt.
Wenn der zweite der zweite angeht als der erste, prüfen Sie, ob die implizite Konvertierung zwischen SubmitDate = @Submitdate implizit ist. Sind beide dateTime?