SQL Server - 更改表与删除并创建

sco*_*ttr 7 sql-server t-sql sql-server-2008-r2 alter-table drop-table

我们的数据库是 SQL Server 2008 R2。我们有一些表有一些 varchar(500) 列,我想切换到 datetime2 或 bigint。我可以保证要切换的列中的所有数据对于正确的类型都是有效的。列更改确实会影响索引,但不会影响键。

在与同事讨论时,我们得出了两种解决问题的方法。这两个都将通过 T-Sql 脚本完成。

  1. 通过 select into 创建临时表,删除旧表并使用正确的数据类型重新创建表。重新创建索引。
  2. 通过更改当前表/数据类型 ALTER TABLE x ALTER COLUMN Y datetime2,然后重建或重新创建索引。

因为我相信数据会干净利落地转换,所以我倾向于#2。我的同事和 DBA 朋友更喜欢 #1,但我的同事不记得他们为什么这样训练他。DBA 朋友正在休假,所以我没有问他为什么。

有人可以提供有关他们认为更好的选择以及为什么的见解吗?最终这是我的决定,我想知道为什么 #1 比 #2 更受欢迎?

Kin*_*hah 10

我最近在我的组织中做了这个,我们想要处理一个有十亿多行的表。

这个想法的所有功劳都归功于 Aaron Bertrand 并且来自他的博客文章Trick Shots : Schema Switch-A-Roo

在小桌子上测试下面的过程,并在 PROD 中进行之前让自己感到舒服。

  1. 创建 2 个模式fakeshadow获得授权dbo
  2. 创建一个表,其中包含您想要的shadow模式中的列和数据类型,例如create table shadow.Correct_Table ...
  3. 插入数据并创建原始表在shadow架构表中的所有索引。
  4. 通过这种方式,您可以拥有包含数据和索引的相同表副本,但它们位于不同的架构中(逻辑上分离)。
  5. 完成后,使用shadow架构更新表上的统计信息。
  6. 切换模式(这是元数据操作,速度非常快)

    --- ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 
    
    BEGIN TRANSACTION;
    
      ALTER SCHEMA fake TRANSFER     dbo.original_table;
      ALTER SCHEMA dbo  TRANSFER  shadow.Correct_Table;
    
    COMMIT TRANSACTION;
    
    ALTER SCHEMA shadow TRANSFER fake.Lookup;
    
    Run Code Online (Sandbox Code Playgroud)
  7. 做最后的检查,看看一切是否按计划进行。你应该做一个select count(1) from dbo.Correct_table

  8. 确认第 7 步并且您感到满意后,将shadow.table, shadowschema 和fakeschema删除为清理。