[英]Correct error handling when dropping and adding columns
我有一个表,当前正在使用几个名为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
)时,是否有任何方法可以获得我正在寻找的带错误处理事务方法?
还是我将不得不分批完成该工作,而如果出现任何问题又无法回滚到原始表?
您为什么担心在事务中创建新列? 只需创建列,然后填充它即可。 填充它时甚至不需要显式tran。 如果失败(极不可能),只需再次执行更新即可。
我将执行以下步骤
另外,值得为您的问题添加更多上下文。 我假设您正在针对测试数据库测试脚本,然后将其应用于产品数据库。 prod数据库很大吗? 很忙? 关键任务? 是否按计划备份?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.