表更改脚本失败,因为它无法看到它尝试添加的内容

时间:2016-09-20 01:10:10

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

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

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!'

但是,当我一次性执行它时,它在Update上出错,说'Column'不存在。

如果我一次运行一行,就可以了。

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

我可以通过使用EXEC进行更新来绕过这个,但这看起来很糟糕。这是唯一的选择吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

我也这么认为@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的情况下正在工作。