【问题标题】:Quickly dropping and re-creating multiple indexes, views, statistics when altering a column更改列时快速删除和重新创建多个索引、视图、统计信息
【发布时间】:2013-08-19 08:30:06
【问题描述】:

我的“项目”表中有一个“StoreNumber”列,我想将其更改为“NOT NULL”。我最近清理了所有旧数据,以便没有空条目。但是,当我执行以下语句时,由于对各种视图、索引和统计信息的多重依赖,它失败了

ALTER TABLE [Project]
    ALTER COLUMN StoreNumber VARCHAR(9) NOT NULL
GO

删除所有这些视图/索引/统计信息然后运行 ​​alter 语句,然后重新创建所有视图/索引/统计信息的最快方法是什么?我知道我可以复制所有的 drop 并一个一个地创建语句,但我更愿意在单个查询中生成脚本。

顺便说一句,为什么 SQL Server 会关心我是否让列更严格?数据不包含空值,我不会更改数据类型或列的大小。这种类型的更改将如何破坏依赖视图、索引或统计信息?我确信有我没有看到的合理推理,但我想要一个例子。

【问题讨论】:

    标签: sql-server alter-table


    【解决方案1】:

    以下将删除多个索引。请注意,最后的语句不包括逗号。

    DROP INDEX [index1_1] ON [schema].[table1],
               [index1_2] ON [schema].[table1],
               [index2_1] ON [schema].[table2],
               [index3_1] ON [schema].[table3],
               ...n,
               [lastIndexToDrop] ON [schema].[tableName]
    

    Drop View 看起来像这样。注意结束语句的分号。

    DROP VIEW [schema].[view1], [schema].[view2];
    

    目前我只关心我的应用程序中的索引。为了快速重新创建索引,我将 .sql 文件读入代码并在 ExecuteNonQuery 调用中执行它。如果我有意见要考虑,我会按照相同的方法从文件中读取到命令中以使用 ExecuteNonQuery 执行。

    https://msdn.microsoft.com/en-us/library/ms173492.aspx

    https://msdn.microsoft.com/en-us/library/ms176118.aspx

    【讨论】:

      【解决方案2】:

      只是想;如果您先设置默认值,它会起作用吗? (不要自己检查sintax)

      ALTER TABLE Project
      ADD CONSTRAINT col_sn_def
      DEFAULT '' FOR StoreNumber;
      GO
      

      【讨论】:

        猜你喜欢
        • 2016-02-22
        • 1970-01-01
        • 2013-12-07
        • 2015-07-15
        • 1970-01-01
        • 2017-10-23
        • 2010-10-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多