我有这个用于计算列的函数:
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 schemabinding
,希望它能使公式变为确定性的,这样我就可以将其持久化。因为两个输入 [Week]
和 [Year]
总是产生相同的结果。
具体错误如下:
表 'Tmp_Bookings' 中的计算列 'AllocatedTimeStart' 无法持久化,因为该列是非确定性的。
我在该列中使用了以下公式:
([dbo].[GetAllocatedStartTime]([Year],[Week]))
列定义如下:
[Week] [int] NOT NULL,
[Year] [int] NOT NULL,
[AllocatedTimeStart] AS ([dbo].[GetAllocatedStartTime]([Year],[Week])),
有什么想法吗?
编辑:
将该行更改为:
RETURN dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT(datetime,CONVERT([varchar](4),@Year,(0))+'0101',112)),(1))))
但是现在我收到一个错误,说该列的公式无效。尽管函数保存得很好。
编辑2:
我已经展示了我正在做的事情(或者至少我已经尝试过了)。实际上没有什么额外的东西。正如它所说,原始函数加上公式引用[dbo].AllocatedStartDate(...)
在列中起作用,但不会持久化,因为它被认为是非确定性的。所以根据建议,我更改了这个函数,用新代码替换了转换部分,所以现在这个函数看起来像:
FUNCTION [dbo].[GetSTime](@Year INT, @Week INT)
RETURNS DATETIME
WITH schemabinding
AS BEGIN
RETURN dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT(datetime,CONVERT([varchar](4),@Year,(0))+'0101',112)),(1))))
END
我在计算字段中尝试使用与之前相同的公式 (([dbo].[GetAllocatedStartTime]([Year],[Week])))
…但被拒绝了,提示它无效...这很奇怪,因为公式是一样的,所以它一定是在对已更改的函数进行某种检查并发现它无效,这也很奇怪,因为我只是用了一个简单的SELECT dbo.GetAllocatedStartTime(2012,13)
就能运行...
所以对于我来说,我很困惑,而且我从未见过SqlFiddle
更别说使用它了。但是确实没有什么比我刚才说的更多了。