Wie ermittelt objectproperty (), ob eine Funktion in SQL Server deterministisch ist?

7

Wie ermittelt SQL Server, ob eine Funktion deterministisch ist oder nicht?

Betrachten Sie die folgende Funktion, ich denke, sie ist deterministisch (da es sich letztendlich um eine Ganzzahloperation handelt), aber der SQL Server gibt 0 zurück, wenn ich die objectproperty-Methode aufrufe.

Wenn ich verstehe, wie es funktioniert, kann ich besser verstehen, warum ich bei der Beurteilung dieser Funktion falsch liege.

CREATE FUNCTION dbo.EndOfPreviousMonth ( @Date date )
RETURNS date
AS BEGIN
    RETURN DATEADD(day, 0 - DAY(@Date), @Date);
END;

SELECT dbo.EndOfPreviousMonth('2010-01-01'); --Usage example

--Returns 0, I expected it to return 1
SELECT OBJECTPROPERTY( OBJECT_ID( 'dbo.EndOfPreviousMonth' ), 'IsDeterministic' );
Brian Dishaw
quelle
Laufen Sie für irgendetwas im Kompatibilitätsmodus? (Vorherige ignorieren, DATEADD ist deterministisch.)
Simon Righarts
Nein, das glaube ich nicht. Ich denke, das heißt, ich habe keinen Kompatibilitätsmodus eingestellt.
Brian Dishaw

Antworten:

7

Zunächst wird geprüft, ob verwendete Funktionen deterministisch sind .
Dann wird geprüft, ob Ihre Funktion schemagebunden ist.
(Oder in umgekehrter Reihenfolge.)

Fügen Sie also with schemabindingIhrer Funktion hinzu.

GSerg
quelle
Das änderte die Antwort auf das, was ich erwartet hatte, aber warum?
Brian Dishaw
@ BrianDishaw Ich bin mir nicht sicher, um ehrlich zu sein. Anscheinend, weil jede Datenzugriffsfunktion nur dann deterministisch ist, wenn das Schema gebunden ist, und SQL Server dieses Verhalten auf Funktionen erweitert, die tatsächlich nicht auf Daten zugreifen. Vielleicht kann es nicht sehen, dass sie es nicht tun.
GSerg
Ich verstehe es auch nicht. Es wäre sinnvoller, wenn ich etwas in der Funktion hätte, das ich fallen lassen könnte. Na ja, danke, dass du dir die Zeit genommen hast, meine Frage zu beantworten!
Brian Dishaw
2
Erklärt hier
Paul White 9