2013-11-27 58 views
3

SQL Server 10.50.1600確定性函數是非確定性的

我想在計算列中使用標量值函數。然後我希望創建一個索引。

ALTER TABLE [dbo].[Modified] 
ADD [StartQDate] AS ([dbo].[QDay]([StartDT])) PERSISTED, 
    [EndQDate] AS ([dbo].[QDay]([EndDT])) PERSISTED; 

我在嘗試創建計算列時收到以下錯誤。

表'Modified'中的計算列'StartQDate'無法保留,因爲該列是非確定性的。

除了事實證明我的標量函數QDay被定義爲

FUNCTION [dbo].[QDay] 
(
@Date DATETIME 
) 
RETURNS INT 
AS 
BEGIN 
    RETURN YEAR(@Date)*10000+MONTH(@Date)*100+DAY(@Date) 
END 

它根據Microsoft應該是確定性的。

即使我改變功能

FUNCTION [dbo].[QDay] 
(
@Date DATETIME 
) 
RETURNS INT 
AS 
BEGIN 
    RETURN 1 
END 

我仍然得到非確定性的錯誤消息。

我有這在另一臺服務器上工作。我不知道該怎麼做。

+0

爲什麼要使用一個標量函數的所有建議? 'EndQDate As Year(EndDT)* 10000 + Month(EndDT)* 100 + DAY(EndDT)'? – gvee

+0

也許'DATETIME'不確定嗎?您鏈接的頁面表示其他函數是確定性的,除非與DATETIME一起使用,並且DATETIME沒有在保證的確定性函數中列出。 – taz

+0

可能相關:http://stackoverflow.com/questions/3037330/why-is-date-time-offset-non-deterministic-in-sql-server-2008 – taz

回答