SQL Server无GO分隔符时删列后重命名列的执行顺序是否有保障
问题解答
写法正确性与执行顺序说明
你给出的写法是正确的,对任意表都会严格按照先删除列、后重命名的顺序执行,这个执行顺序和EXEC无关,原理如下:
- SQL Server 中同一个批处理内的语句默认就是按书写顺序串行执行的,前一条语句完全执行完成、元数据变更生效后才会触发下一条语句的执行,你测试的结果就是这个规则的直接体现。
GO本身不属于SQL语法,只是SSMS、sqlcmd等客户端工具用来拆分不同批处理的标记,你的场景不需要用GO拆分批处理,同一个批处理内的顺序本身就是稳定的。ALTER TABLE DROP COLUMN属于DDL操作,执行时会持有表的架构修改锁(Sch-M锁),直到操作完成才会释放,就算是超大表删除列需要执行很长时间,后续的sp_rename也必须等锁释放后才能执行,不可能出现重命名操作提前跑的情况。
优化建议
当前写法仅在两条语句都执行成功的情况下符合预期,如果第一条删除列操作失败(比如列不存在、存在未删除的关联约束),第二条重命名操作还是会执行,建议增加事务和异常判断保证操作的原子性:
BEGIN TRANSACTION BEGIN TRY ALTER TABLE mytbl DROP COLUMN tmpcol EXEC sp_rename 'mytbl.tmpcol2', 'tmpcol', 'COLUMN' COMMIT TRANSACTION END TRY BEGIN CATCH ROLLBACK TRANSACTION THROW END CATCH
内容的提问来源于stack exchange,提问作者sdfß234sa
相关产品推荐
相关产品推荐

