【发布时间】:2011-09-16 15:20:24
【问题描述】:
我正在生成一个脚本,用于将更改从多个开发数据库自动迁移到登台/生产。基本上,它需要一堆更改脚本,并将它们合并为一个脚本,将每个脚本包装在 IF whatever BEGIN ... END 语句中。
但是,有些脚本需要 GO 语句,以便 SQL 解析器在创建新列后知道它。
ALTER TABLE dbo.EMPLOYEE
ADD COLUMN EMP_IS_ADMIN BIT NOT NULL
GO -- Necessary, or next line will generate "Unknown column: EMP_IS_ADMIN"
UPDATE dbo.EMPLOYEE SET EMP_IS_ADMIN = whatever
但是,一旦我将其包装在 IF 块中:
IF whatever
BEGIN
ALTER TABLE dbo.EMPLOYEE ADD COLUMN EMP_IS_ADMIN BIT NOT NULL
GO
UPDATE dbo.EMPLOYEE SET EMP_IS_ADMIN = whatever
END
它失败了,因为我发送的 BEGIN 没有匹配的 END。但是,如果我删除 GO 它会再次抱怨未知列。
有没有办法在单个 IF 块中创建和更新同一列?
【问题讨论】:
-
@gbn:是的,我知道为什么会发生这种情况(见第二段);但我不知道如何解决它 - 我是否真的需要将每个查询变成一堆字符串!?
-
@BlueRaja:有什么问题?如果它有效,那么这就是一天结束时最重要的事情。如果所提供的解决方案存在合法的业务问题,请表达出来。将每个查询转换成一堆字符串有什么特别令人不安的地方吗?
-
@mellamokb:是的,有问题;如果在任何其他上下文(例如注释或字符串)中使用了单词 GO,则脚本将不起作用。此外,如果出现任何问题,我们会在错误消息中丢失有用的行号。有没有办法通过交易来做到这一点?还是尝试/抓住?
-
@BlueRaja: 1) 我相信
GO必须单独在一行中,因此您只能搜索这种情况,而不是搜索单词GO的每个实例。 2)您始终可以记录哪些语句已成功完成。或者您可以将整个内容包装在 try/catch 中,并使用您自己的行号,使用您跟踪的某个变量(如 @lineNo)并报告错误。由于您是自动生成这些,因此进行这样的更改应该是轻而易举的事。当我认为可以找到解决您所有问题的解决方案时,听起来您显然不想探索这条路线。
标签: sql sql-server tsql sql-server-2008