0

我有一个现有表我想添加一个计算列

[dbo].[Route]
   ...
   [EstimatedArrival] TIME (7) NOT NULL,
   [DriveSeconds]     INT      NOT NULL,
   [WaitSeconds]      INT      NOT NULL,
   ...

但是当我尝试添加TIME下面的计算列时

ALTER TABLE [dbo].[Route]
  ADD [EstimatedDeparture] AS 
  CONVERT (TIME (7), DATEADD(SECOND, 
    (((DATEPART(HOUR, [EstimatedArrival]) * 3600) 
     + (DATEPART(MINUTE, [EstimatedArrival]) * 60)  
     + DATEPART(SECOND, [EstimatedArrival])) 
     - [DriveSeconds] - [WaitSeconds]), ''), 114) 
  PERSISTED;

它抛出

无法保留表“Route”中的计算列“EstimatedDeparture”,因为该列是不确定的。

为什么?我认为CONVERT(TIME (7) ...)应该保证列类型为TIME

请注意,如果我在查询中使用此 Convert 表达式,它可以正常工作。我该如何解决这个问题?

4

2 回答 2

2

这个空字符串应该代表什么?

- [DriveSeconds] - [WaitSeconds]), ''), 114) 
-----------------------------------^^

这可能会告诉 SQL Server 您将把其中的一部分解释为字符串。虽然我同意 HABO 的观点,即您也不需要 114 样式,但我能够使用以下代码完成这项工作,它仍然使用不必要的样式编号:

- [DriveSeconds] - [WaitSeconds]), 0), 114) 

这是否仍然保留正确的计算,我不确定,因为我不知道意图是什么,但在这里避免隐式转换为字符串应该可以避免这个问题。

于 2013-07-31T02:42:07.867 回答
1

您可以通过这种方式更正和简化它:

ALTER TABLE [dbo].[Route]
ADD [EstimatedDeparture] AS 
CONVERT (TIME (7), DATEADD(SECOND, - [DriveSeconds] - [WaitSeconds], [EstimatedArrival]))
PERSISTED;
于 2013-07-31T04:17:16.227 回答