2016-08-16 7 views
10

ここは本当に単純な関数ですが、これは確定的に戻ってきます。私がそれをネイティブにコンパイルすると、それはもはや確定的ではありません。どうすればそれをネイティブでコンパイルして決定論的にすることができますか?SQLメモリを最適化する方法ネイティブコンパイル済み関数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

決定的に戻ってくるネイティブスピーカーが見つかりましたか? – dfundako

+0

決定論的なネイティブ関数が見つかりませんでした。それらの関数はすべて非決定論的に出てきます。 –

+0

[docs](https://msdn.microsoft.com/en-us/library/ms178091.aspx)はこの詳細を知らせていないので、あなたは 'ATOMIC WITH'部分を既に起こっている?トランザクション分離レベルを設定することは、グローバル状態に影響を及ぼし、非決定論に適格である可能性が高い。 btw。どのバージョンを使用していますか? – dlatikay

答えて

1

だけの推測、私はそれをテストするために2016年、
を持っていないが、私は変更しようとします:

RETURN N';' 

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

TO私は問題があることだと思います N';'NVARCHAR(1)として作成され、暗黙的に NCHAR(1)に変換されるため、変換によって非決定的になる可能性があります。

+0

これを試してお知らせします。提案していただきありがとうございます。 –

+0

@AaronStainback試してみましたか?私は興味があります:) – MtwStark

+0

まだ戻ってくる 'NO' :( –

関連する問題