2016-08-16 5 views
10

Hier ist eine wirklich, wirklich einfache Funktion, kommt es deterministisch zurück. Wenn ich es nativ kompiliere, ist es nicht mehr deterministisch. Wie kann ich es nativ kompiliert und deterministisch machen?Wie man SQL-Speicher optimiert Native kompilierte Funktion Deterministic

CREATE FUNCTION [hash].[HashDelimiter2]() 
RETURNS NCHAR(1) 
WITH SCHEMABINDING 
AS BEGIN 
     RETURN N';' 
END 
GO 

/* This does indeed result in YES */ 
SELECT IS_DETERMINISTIC 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_NAME = 'HashDelimiter2' 



/* But then compile it native and it's no longer deterministic */ 
CREATE FUNCTION [hash].[HashDelimiter3]() 
RETURNS NCHAR(1) 
WITH NATIVE_COMPILATION, SCHEMABINDING 
AS BEGIN ATOMIC WITH (
    TRANSACTION ISOLATION LEVEL = SNAPSHOT, 
    LANGUAGE = N'English' 
) 
    RETURN N';' 
END 
GO 

/* This results in NO */ 
SELECT IS_DETERMINISTIC 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_NAME = 'HashDelimiter3' 
+0

Haben Sie gefunden, dass irgendwelche Sprocs, die nativ sind, als deterministisch zurückkehren? – dfundako

+0

Ich habe keine deterministischen nativen Funktionen gefunden, alle von denen, die ich schreibe, kommen nichtdeterministisch heraus. –

+0

nur eine Vermutung, da die [docs] (https://msdn.microsoft.com/en-us/library/ms178091.aspx) dieses Detail nicht verraten: haben Sie den 'ATOMIC WITH'-Teil als ausgeschlossen denn schon? Das Festlegen der Transaktionsisolationsstufe beeinflusst wahrscheinlich den globalen Status und qualifiziert sich für Nicht-Determinismus. übrigens. Welche Version verwendest du? – dlatikay

Antwort

1

nur eine Vermutung, ich habe nicht 2016 zu testen,
aber ich werde versuchen zu ändern:

RETURN N';' 

TO

DECLARE @R AS NCHAR(1) = N';' 
RETURN @R 

ich das Problem denken ist, dass N';' wird als NVARCHAR(1) erstellt und dann implizit in NCHAR(1) konvertiert, so dass die Konvertierung möglicherweise nicht deterministisch ist.

+0

Ich werde dies versuchen und lassen Sie es wissen. Danke für den Vorschlag. –

+0

@AaronStainback hast du es versucht? Ich bin neugierig :) – MtwStark

+0

Nein kommt immer noch zurück "NEIN" :( –

Verwandte Themen