即使不执行条件SQL块也会对其进行评估

时间:2016-03-16 16:00:07

标签: sql-server database-migration

我正在为数据库编写迁移脚本,并希望使其具有幂等性,因此我们可以安全地运行它多次,而不必担心它会在第一次尝试之后改变数据库(/迁移数据)

此迁移的一部分涉及从表中删除列,但首先将该数据插入另一个表中。为此,我有这些方面的东西。

IF EXISTS
    (SELECT * FROM sys.columns 
      WHERE object_id = OBJECT_ID('TableToBeModified')
        AND name = 'ColumnToBeDropped')
BEGIN
    CREATE TABLE MigrationTable (
        Id int,
        ColumnToBeDropped varchar
    );

    INSERT INTO MigrationTable
    (Id, ColumnToBeDropped)
    SELECT Id, ColumnToBeDropped
      FROM TableToBeModified;
END

第一次,这很好,因为它仍然存在。但是,在后续尝试中,它会失败,因为该列不再存在。我理解整个脚本都会被评估,而我可以将内部内容放入EXEC语句中,但这真的是解决这个问题的最佳解决方案,还是有另一个,仍然可能是“有效执行”选项?

2 个答案:

答案 0 :(得分:0)

  

我理解整个脚本都会被评估,我可以将内部内容放入EXEC语句中,但这确实是解决此问题的最佳方法

是。由于脚本中其他地方的依赖性,您可能希望推迟解析验证。即使没有当前的问题,我甚至有时会把事情放到EXEC中,以确保不会因为当前部署之后的添加更改而导致脚本的其余部分发生更改或环境脚本开发。轻微地,它有助于在视觉上打破局面。

虽然可能存在与因使用动态SQL而导致更改所有权更改相关的权限问题,但这很少是转发脚本的问题,而不是我遇到过的问题。

答案 1 :(得分:-1)

如果我们不确定该脚本是否可以正常迁移数据库。

但是,为了查询与更新数据相关的更改,我将使用 BEGIN TRAN 执行脚本并检查结果,然后我们需要执行 COMMIT TRAN 否则 ROLLBACK 交易,因此会放弃交易。