Sql 为什么转换(时间(7),表达式)不是确定性的?

Sql 为什么转换(时间(7),表达式)不是确定性的?,sql,sql-server,tsql,calculated-columns,Sql,Sql Server,Tsql,Calculated Columns,我有一个现有的表,我想添加一个计算列 [dbo].[Route] ... [EstimatedArrival] TIME (7) NOT NULL, [DriveSeconds] INT NOT NULL, [WaitSeconds] INT NOT NULL, ... 但是当我试图在下面添加时间的计算列时 ALTER TABLE [dbo].[Route] ADD [EstimatedDeparture] AS C

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

[dbo].[Route]
   ...
   [EstimatedArrival] TIME (7) NOT NULL,
   [DriveSeconds]     INT      NOT NULL,
   [WaitSeconds]      INT      NOT NULL,
   ...
但是当我试图在下面添加
时间的计算列时

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表达式,它可以正常工作。
如何解决此问题?

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

- [DriveSeconds] - [WaitSeconds]), ''), 114) 
-----------------------------------^^
这可能会告诉SQLServer您将把其中的一部分解释为字符串。虽然我同意HABO的观点,即您也不需要114样式,但我可以使用以下样式来完成此工作,其中仍然使用了不必要的样式编号:

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

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

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

- [DriveSeconds] - [WaitSeconds]), ''), 114) 
-----------------------------------^^
这可能会告诉SQLServer您将把其中的一部分解释为字符串。虽然我同意HABO的观点,即您也不需要114样式,但我可以使用以下样式来完成此工作,其中仍然使用了不必要的样式编号:

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

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

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

ALTER TABLE [dbo].[Route]
ADD [EstimatedDeparture] AS 
CONVERT (TIME (7), DATEADD(SECOND, - [DriveSeconds] - [WaitSeconds], [EstimatedArrival]))
PERSISTED;

您可以通过以下方式对其进行更正和简化:

ALTER TABLE [dbo].[Route]
ADD [EstimatedDeparture] AS 
CONVERT (TIME (7), DATEADD(SECOND, - [DriveSeconds] - [WaitSeconds], [EstimatedArrival]))
PERSISTED;

@事实证明,其中有一个字符串格式(注意
'
),而114似乎与问题无关。@事实证明,其中有一个字符串格式(注意
'
),而114似乎与问题无关。根据,这是
DATEADD
date
参数。将其设置为0可修复此问题。明亮的此外,我同意不需要114。根据,这是
DATEADD
date
参数。将其设置为0可修复此问题。明亮的我也同意114是不需要的。