【问题标题】:Changing all computed columns to persisted将所有计算列更改为持久化
【发布时间】:2014-08-15 18:59:18
【问题描述】:

我有以下查询来检查我的数据库的哪些列是计算出来的,而不是持久化的

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

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

【问题讨论】:

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

标签: sql-server sql-server-2008 calculated-columns persisted-column


【解决方案1】:

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

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 表定义可以在http://msdn.microsoft.com/en-us/library/ms190273.aspx找到。

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

【讨论】:

    猜你喜欢
    • 2017-08-24
    • 2010-12-16
    • 2010-10-29
    • 2020-10-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多