2016-08-16 25 views
10

Đây là một chức năng thực sự đơn giản, nó trở lại xác định. Nếu tôi biên dịch nó, nó không còn xác định nữa. Làm thế nào tôi có thể làm cho nó có nguồn gốc được biên dịch và xác định?Làm thế nào để làm cho SQL bộ nhớ tối ưu hóa bản địa hóa chức năng xác định

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

Bạn đã tìm thấy BẤT K sp sprocs nào có nguồn gốc quay trở lại như xác định? – dfundako

+0

Tôi không tìm thấy bất kỳ hàm gốc xác định nào, tất cả chúng tôi viết đều không xác định được. –

+0

chỉ cần đoán, vì [tài liệu] (https://msdn.microsoft.com/en-us/library/ms178091.aspx) không cho biết chi tiết này: bạn đã loại bỏ phần 'ATOMIC WITH' là nguyên nhân? việc thiết lập mức cô lập giao dịch có thể ảnh hưởng đến trạng thái toàn cầu và đủ điều kiện cho tính không xác định. btw. Phiên bản bạn đang sử dụng? – dlatikay

Trả lời

1

chỉ đoán, tôi không có 2016 để kiểm tra nó,
nhưng tôi sẽ cố gắng thay đổi:

RETURN N';' 

ĐẾN

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

Tôi nghĩ vấn đề là N';' được tạo dưới dạng NVARCHAR(1) và sau đó được chuyển thành ẩn thành NCHAR(1) để có thể chuyển đổi làm cho nó không xác định.

+0

Tôi sẽ thử tính năng này và cho bạn biết. Cám ơn vì sự gợi ý. –

+0

@AaronStainback bạn đã thử chưa? Tôi tò mò :) – MtwStark

+0

Nope vẫn trở lại 'KHÔNG': ( –

Các vấn đề liên quan