【问题标题】:Table alter script failing because it can't see what it's trying to add表更改脚本失败,因为它看不到它试图添加的内容
【发布时间】:2016-09-20 01:10:09
【问题描述】:

我需要执行一个脚本,将新列添加到表中,然后根据现有列更新该列。

PRINT 'Adding Column to Table...'

ALTER TABLE dbo.Table
ADD [Column] DATETIME2 NULL;

PRINT 'Updating data...'
UPDATE dbo.Table
SET [column] = ISNULL([ModifiedDate],[CreatedDate]) 

PRINT 'Finalising table structure...'
ALTER TABLE dbo.Table
ALTER COLUMN [Column] DATETIME2 NOT NULL

PRINT 'Complete!'

但是,当我一口气执行它时,它在更新时出错,说“列”不存在。

如果我一次运行一行,它就可以工作。

有没有办法解决这个问题?

我可以通过使用 EXEC 来执行 UPDATE 来绕过这个,但这似乎很老套。这是唯一的选择吗?

【问题讨论】:

    标签: sql sql-server sql-server-2014 ddl


    【解决方案1】:

    问题是UPDATE编译的时候,列不知道。我认为您可以通过在不同命令之间插入 GO 来解决该问题。

    但是,为什么不只使用计算列:

    ALTER TABLE dbo.Table ADD [Column] AS COALESCE([ModifiedDate],[CreatedDate]) ;
    

    使用计算列,您无需进行更新,并且值始终正确。

    【讨论】:

    • 那是个好主意。问题是更改是由于错误引起的。 ModifiedDate 和 CreatedDate 是审计字段,不打算由应用程序使用,因此我们需要一个单独的“业务价值”列。
    【解决方案2】:

    我也认为正如@Gordon 所说,您可以通过在语句之间使用 GO 来解决这个问题,如下所示:

    PRINT 'Adding Column to Table...'
    
    ALTER TABLE dbo.[Table] ADD [Column] DATETIME2 NULL;
    
    GO
    
    PRINT 'Updating data...'
    UPDATE dbo.[Table]
    SET [column] = ISNULL([ModifiedDate],[CreatedDate]) 
    
    GO
    
    PRINT 'Finalising table structure...'
    ALTER TABLE dbo.[Table]
    ALTER COLUMN [Column] DATETIME2 NOT NULL
    
    PRINT 'Complete!'
    

    您能否尝试使用此代码。我已将表名括在方括号中,它是一个保留关键字,因此无法在 SQL2012 中执行,并且它在没有 GO 的情况下工作到我的终点。

    【讨论】:

      猜你喜欢
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 2020-12-06
      • 2019-03-10
      • 1970-01-01
      相关资源
      最近更新 更多