我需要执行一个脚本,向表中添加一个新列,然后根据现有列更新该列。
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进行更新来绕过这个,但这看起来很糟糕。这是唯一的选择吗?
答案 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的情况下正在工作。