添加计算列时出现“验证公式错误”,使用CONVERT(DATE, column)。

5
我正在尝试通过SSMS向表添加计算列 - 我不想详细说明为什么基础列是VARCHAR(10)而不是DATE,也不想更改它。
当我在表设计器中输入公式CONVERT(DATE, [charDob])时,SSMS报告如下错误:
“验证列charDobTyped的公式时出错。”
使用公式[charDob]按预期工作,这意味着列已正确绑定。此外,公式CONVERT(DATE, '2001')也按预期工作 - 因此,在使用该列时存在某些导致错误的问题。
原始列是VARCHAR(10),包含NULL值或其他可转换为DATE的值。查询SELECT CONVERT(DATE,charDob) as dob FROM people按预期工作。此外,错误消息是关于“无效公式”,而不是数据转换错误,因此我不认为无法转换是导致这个问题的原因。
我已经保存了具有新计算列和虚拟值的表,并重新连接到数据库 - 这是为了确保没有发生奇怪的缓存问题,因为有时会发生。错误与持久标志无关 - 如果只有关闭它那么容易。

你尝试过使用正确的ALTER TABLE语句,而不是充满各种错误的UI界面吗?或者也许你需要澄清一下你所说的“尝试使用公式”的意思? - Aaron Bertrand
1
@AaronBertrand 叮叮叮。分数加给你 - 是的,通过DROP/ADD方式确实可以正常工作。(我真笨,早该试一下了。)将此作为答案发布以供采纳/投票。 - user166390
1个回答

9

管理工作室并不是执行大多数DDL操作的最佳方式。请打开一个新的查询窗口,并使用以下内容:

ALTER TABLE dbo.whatever ADD newcolumn AS (CONVERT(DATE, CharDob));

这里有一个具体的bug: http://connect.microsoft.com/SQLServer/feedback/details/291134/katmai-table-designer-cant-validate-computed-column-formula 在这种情况下,“下一版本”肯定是指SQL Server 2012,所以如果你使用2008或2008 R2 SSMS(为什么?),修复程序将不适用于你。

顺便提一下,如果想要日期转换是确定性的,必须应用样式(例如 CONVERT(DATE,x,20))。 - user166390
@pst 是的,持久性有一些额外的要求,特别是对于日期/时间类型。不管怎样,很高兴你的问题解决得很简单。建议使用更新版本的SSMS - 很多这些小错误都已经修复了,而且还有很多改进的功能。 - Aaron Bertrand
3
SQL Server 2016(SSMS 13.0.16106.4 对 SQL 12.0.4100.1)。这仍然是一个错误。一个非常烦人的错误。我无法重新排列我的列,因为 SSMS 表示无法验证公式,即使我使用 T-SQL 添加了它们。 - Nick.McDermaid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接