【发布时间】:2012-12-16 23:04:07
【问题描述】:
我有一个计算列的函数:
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:
我已经准确地展示了我在做什么(或者至少我已经尝试过)。真的没有什么额外的。正如它所说的前一个函数(原始函数)与列中的公式 ref [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 没关系使用它。但真的没有什么比我刚才说的更多了。
【问题讨论】:
-
问题不在于您的函数,而在于您表上的计算列。在您的问题上发布该定义,以便我们为您提供帮助
-
这适用于什么版本的 SQL-Server?
-
你改了哪一行?您的意思是您将计算列定义更改为直接使用
RETURN dateadd(...)? -
@AndriyM 是的,正如 damien 建议的那样,我取出了原始转换并用更明确的版本替换它。
-
看起来 SQL Fiddle 存在问题。 this 工作得更好吗? sqlfiddle.com/#!6/8fd88/1/0
标签: sql-server database sql-server-2008-r2 calculated-columns