2016-09-20 59 views
0

我需要执行一个脚本,将新列添加到表中,然后基于现有列更新该列。表alter脚本失败,因为它看不到它要添加的内容

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做更新,但似乎hacky。它是唯一的选择吗?

回答

2

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

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

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

与计算列,你不需要做一个更新,和值总是正确的。

+0

这将是一个好主意。问题在于这种变化是由于一个错误。 ModifiedDate和CreatedDate是审计字段,不应该被应用程序使用,所以我们需要一个单独的“业务价值”列。 – Craig

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的情况下工作到我的末尾。

相关问题