根据BOL http://msdn.microsoft.com/en-us/library/ms175088.aspx:
索引视图和计算列上的索引将结果存储在
数据库供以后参考。存储的结果仅在所有情况下才有效
引用索引视图或索引计算列的连接
可以生成与创建的连接相同的结果集
指数。
为了创建具有持久计算列的表,必须启用以下连接设置:
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET ARITHABORT ON
SET CONCAT_NULL_YIELDS_NULL ON
SET NUMERIC_ROUNDABORT ON
SET QUOTED_IDENTIFIER ON
这些值是在数据库级别设置的,可以使用以下命令查看:
SELECT
is_ansi_nulls_on,
is_ansi_padding_on,
is_ansi_warnings_on,
is_arithabort_on,
is_concat_null_yields_null_on,
is_numeric_roundabort_on,
is_quoted_identifier_on
FROM sys.databases
然而,SET 选项也可以由客户端应用程序设置 http://beyondrelational.com/blogs/jacob/archive/2008/09/09/understanding-sql-server-set-options-2-set-ansi-nulls-on-off.aspx连接到 SQL Server。
一个完美的例子是 SQL Server Management Studio,它的 SET ANSI_NULLS 和 SET QUOTED_IDENTIFIER 的默认值都为 ON。这是我最初无法复制您发布的错误的原因之一。
无论如何,要重复错误,请尝试以下操作(这将覆盖 SSMS 默认设置):
SET ANSI_NULLS ON
SET ANSI_PADDING OFF
SET ANSI_WARNINGS OFF
SET ARITHABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET NUMERIC_ROUNDABORT OFF
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE T1 (
ID INT NOT NULL,
TypeVal AS ((1)) PERSISTED NOT NULL
)
您可以使用以下方法修复上面的测试用例:
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
我建议在创建表和相关索引之前在脚本中调整这两个设置。