0

我有一个表,它当前正在使用几个名为DateFromand的列DateTo。我正在尝试用单个NewDate列替换它们,为现有行填充值来自DateFrom.

我需要良好的错误/事务处理,因为如果更改失败,我不想要中间表,我想恢复。

我已经尝试了很多东西,但无法让它正常工作。任何帮助表示赞赏,因为我远没有这方面的经验。

我从

BEGIN TRAN

ALTER TABLE TableName
ADD NewDate DATETIME

IF @@ERROR = 0 AND @@TRANCOUNT = 1
UPDATE TableName
SET NewDate = ValidFrom
....

这会立即失败,因为NewDate当前不是表中的列。好的,所以我GO在那里添加一个。这将它分成两批,现在运行,除了它使@@ERROR检查毫无意义。我也不能使用局部变量,因为它们也会丢失GO。理想情况下,我想使用 aTRY...CATCH 来避免在每个语句之后检查错误,但我不能使用 a GO,因为它需要是一批。

我发现的所有文章都没有谈论这种情况(使用 进行错误处理GO)。所以问题是:在添加和更新列时(这似乎需要某个地方),有什么方法可以得到我正在寻找的带有错误的事务处理方法GO

还是我将不得不分批进行,如果出现任何问题,我无法回滚到我原来的表?

4

1 回答 1

0

您为什么担心在事务中创建新列?只需创建列,然后填充它。填充时甚至不需要显式 tran。如果失败(这不太可能),只需再次进行更新。

我会执行以下步骤

  1. 添加新列
  2. 更新新列
  3. 检查新列中的数据是否正确
  4. 删除不再需要的旧列(您可能希望在删除它们之前检查这些列的使用位置,例如它们是否用于任何存储过程、报告、前端应用程序代码)

此外,值得为您的问题添加更多上下文。我假设您正在针对测试数据库测试脚本,然后将脚本应用到产品数据库。prod数据库很大吗?很忙?关键任务?按计划备份?

于 2012-10-16T14:22:49.817 回答