我有一个计算列的函数:
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]))
和列 defs :
[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,用新代码替换了转换部分,所以函数现在看起来像:
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
没关系使用它。但真的没有什么比我刚才所说的更多了。