如何使SQL内存优化本机编译函数确定性

Aar*_*ack 10 sql t-sql sql-server

这是一个非常非常简单的功能,它回归确定性.如果我将其编译为原生,则不再具有确定性.如何使其本地编译和确定性?

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'
Run Code Online (Sandbox Code Playgroud)

Mtw*_*ark 1

只是猜测,我没有2016年的时间来测试它,
但我会尝试改变:

RETURN N';'
Run Code Online (Sandbox Code Playgroud)

DECLARE @R AS NCHAR(1) = N';'
RETURN @R
Run Code Online (Sandbox Code Playgroud)

我认为问题是N';'创建为NVARCHAR(1)然后隐式转换为NCHAR(1)所以也许转换使其具有不确定性。