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是不需要的。