sql-server – 不能持久计算列 – 不确定

前端之家收集整理的这篇文章主要介绍了sql-server – 不能持久计算列 – 不确定前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个计算列的这个功能
CREATE FUNCTION [dbo].[GetAllocatedStartTime](@Year INT,@Week INT)
RETURNS DATETIME

WITH schemabinding
AS BEGIN
    RETURN dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT([varchar](4),@Year,(0))+'-01-01'),(1))))
END

GO

添加了WITH模式绑定,希望它会使它确定性,所以我可以坚持下去.应该是作为两个输入[周]和[年]将总是产生相同的结果.

确切的错误是:

Computed column ‘AllocatedTimeStart’ in table ‘Tmp_Bookings’ cannot be persisted because the column is non-deterministic.

我在列中使用这个公式:

([dbo].[GetAllocatedStartTime]([Year],[Week]))

列清除:

[Week] [int] NOT NULL,[Year] [int] NOT NULL,[AllocatedTimeStart]  AS ([dbo].[GetAllocatedStartTime]([Year],[Week])),

有任何想法吗?

编辑:

改为:

RETURN dateadd(week,CONVERT(datetime,(0))+'0101',112)),(1))))

但是现在我收到一个错误,表示该列的公式无效.即使功能很好.

编辑2:

我已经显示了我正在做的(或至少我已经尝试过).没有什么额外的真的正如它之前的功能(原来的一个)加上公式ref [dbo] .AllocatedStartDate(…)在列中的工作,但不是坚持,它说这是非确定性的.所以根据建议我改变了FUNCTION,用新的代码替换了转换部分,所以这个功能现在看起来像:

FUNCTION [dbo].[GetSTime](@Year INT,@Week INT)

RETURNS DATETIME
WITH schemabinding
AS BEGIN
    RETURN dateadd(week,(1))))
END

然后我在计算的字段(([dbo].[GetAllocatedStartTime]([Year],[Week])))中尝试了与之前相同的公式,并拒绝该公式,表示其无效…这是奇怪的是,公式是一样的,所以它必须做一些检查更改的函数,并发现无效,这也是奇怪的,因为我做了一个简单的SELECT dbo.GetAllocatedStartTime(2012,13),它的工作. ..

所以是的,我很困惑,我从来没有看过sqlFiddle从来不介意使用它.但真的没有什么比我刚刚说的更多.

解决方法

CONVERT([varchar](4),@ Year,(0))’-01-01’正被传递给DATEDIFF调用,处于期望日期的位置,强制执行隐式转换.

deterministic functions的规则:

CAST

Deterministic unless used with datetime,smalldatetime,or sql_variant.

CONVERT

Deterministic unless one of these conditions exists:

Source or target type is datetime or smalldatetime,the other source or target type is a character string,and a nondeterministic style is specified. To be deterministic,the style parameter must be a constant. Additionally,styles less than or equal to 100 are nondeterministic,except for styles 20 and 21. Styles greater than 100 are deterministic,except for styles 106,107,109 and 113.

嗯,你既不打电话,但你依赖于一个隐含的转换,我期望像CAST一样行事.而不是依赖于此,我将切换到使用CONVERT并给出确定性样式参数.

所以,我会做:CONVERT(datetime,(0))’0101′,112).这样做后,函数本身就变成了确定性的

猜你在找的MsSQL相关文章