Sql server 将所有计算列更改为持久化

Sql server 将所有计算列更改为持久化,sql-server,sql-server-2008,calculated-columns,persisted-column,Sql Server,Sql Server 2008,Calculated Columns,Persisted Column,我使用以下查询来检查数据库中哪些列是计算的,哪些列不是持久的 select t.name, c.name from sys.tables t inner join sys.computed_columns c on c.object_id = t.object_id where c.is_persisted = 0 是否有任何简单的查询可以将所有这些列更新为持久化?您可以使用上面的查询创建一个脚本,该脚本执行以下操作: SELECT schemas.name , all_object

我使用以下查询来检查数据库中哪些列是计算的,哪些列不是持久的

select t.name, c.name
from sys.tables t
inner join sys.computed_columns c on c.object_id = t.object_id
where c.is_persisted = 0

是否有任何简单的查询可以将所有这些列更新为持久化?

您可以使用上面的查询创建一个脚本,该脚本执行以下操作:

SELECT schemas.name
     , all_objects.name
     , 'ALTER TABLE ' + QUOTENAME( schemas.name ) + '.' + QUOTENAME( all_objects.name ) + ' ALTER COLUMN ' + QUOTENAME( computed_columns.name ) + ' ADD PERSISTED;'
 FROM sys.schemas
 INNER JOIN sys.all_objects
    ON schemas.schema_id = all_objects.schema_id
 INNER JOIN sys.computed_columns
    ON all_objects.object_id = computed_columns.object_id
   AND computed_columns.is_persisted = 0;
可以找到alter表定义


请注意持久化列的限制非确定性函数等很可能会导致部分脚本失败。

是否尝试对sys.computed\u列执行更新查询?当然。该消息是:不允许对系统目录进行临时更新。我只是在谷歌上搜索了该错误消息,并看到了许多关于如何解决该问题的结果。@Tab请不要建议人们直接更新系统目录。你真的认为更新会神奇地将所有这些值写入磁盘吗?不。如果你找到了解决方法,你可能会做的就是破坏你的数据库,使你的支持无效,以及其他很多事情。你今天穿着糟糕的牛仔裤吗?还要注意,不是所有的计算列都可以持久化,除了将它们更改为持久化之外,你可能还必须删除并重新创建它们所涉及的任何约束或索引。。。