确定性函数是非确定性的

awp*_*mus 3 t-sql sql-server-2008-r2

SQL Server 10.50.1600

我试图在计算列中使用标量值函数.然后我希望创建一个索引.

ALTER TABLE [dbo].[Modified]
ADD [StartQDate] AS ([dbo].[QDay]([StartDT])) PERSISTED,
    [EndQDate]   AS ([dbo].[QDay]([EndDT])) PERSISTED;
Run Code Online (Sandbox Code Playgroud)

我尝试创建计算列时收到以下错误.

表'Modified'中的计算列'StartQDate'无法保留,因为该列是非确定性的.

除了我的标量函数QDay定义为

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

根据微软的说法应该是确定性的.

即使我将功能更改为

FUNCTION [dbo].[QDay] 
(
@Date DATETIME
)
RETURNS INT
AS
BEGIN
    RETURN 1
END
Run Code Online (Sandbox Code Playgroud)

我仍然收到Non-Deterministic错误消息.

我有这个在另一台服务器上工作.我不知道该怎么办.

awp*_*mus 5

解决方案是添加

WITH SCHEMABINDING
Run Code Online (Sandbox Code Playgroud)

正如在这个问题中建议的Sql Server确定性的用户定义函数

FUNCTION [dbo].[QDay] 
(
    @Date DATETIME
)
RETURNS INT
WITH SCHEMABINDING
AS
BEGIN
    RETURN YEAR(@Date)*10000+MONTH(@Date)*100+DAY(@Date)
END
Run Code Online (Sandbox Code Playgroud)