我的表格目前正在使用名为DateFrom
和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
之后也会丢失。理想情况下,我想使用TRY...CATCH
来避免在每个语句后检查错误,但我不能使用GO
,因为它需要是一个批处理。
我发现的所有文章都没有谈到这种情况(使用GO
进行错误处理)。所以问题是:是否有任何方式我可以在添加和更新列时找到我正在寻找的事务处理错误处理方法(这似乎需要GO
某处)?
或者我将不得不满足于分批处理,如果出现任何问题,我无法回滚到原来的桌子上?
答案 0 :(得分:0)
为什么您担心在交易中创建新列?只需创建列然后填充它。填充它时甚至不需要显式tran。如果失败(这是非常不可能的),只需再次进行更新。
我会做以下步骤
此外,值得为您的问题添加更多上下文。我假设您正在测试针对测试数据库的脚本,稍后将该脚本应用于prod数据库。 prod数据库非常大吗?很忙?关键任务?按计划进行备份?