我正在生成一个脚本,用于将更改从多个开发数据库自动迁移到暂存/生产中。基本上,它需要一堆更改脚本,并将它们合并为一个脚本,然后将每个脚本包装在一条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
块中创建和更新同一列?
2
请参阅stackoverflow.com/questions/4855537/…请
—
gbn
@gbn:是的,我知道为什么会发生这种情况(请参阅第二段);但是我不知道如何解决-我真的需要将每个查询变成一堆字符串吗?
—
BlueRaja-Danny Pflughoeft
@BlueRaja:有什么问题?如果可行,那么到一天结束时,这才是最重要的。如果提供的解决方案存在合法的业务问题,请对此进行说明。关于将每个查询转换为一串字符串是否有特别令人不安的东西?
—
mellamokb
@mellamokb:是的,有问题;如果在任何其他上下文(例如注释或字符串)中使用了单词GO,则该脚本将不起作用。同样,如果发生任何错误,我们将在错误消息中丢失有用的行号。交易没有办法做到这一点吗?还是尝试/捕捉?
—
BlueRaja-Danny Pflughoeft
@BlueRaja:1)我相信
—
mellamokb 2011年
GO
它必须自己排成一行,因此您只能搜索这种情况,而不是单词的每个实例GO
。2)您始终可以记录成功完成哪些语句。或者,您可以将整个内容包装在try / catch中,并使用一些变量(例如@lineNo)使用自己的行号,您可以跟踪该行号并报告错误。由于您是自动生成这些内容的,因此轻而易举地进行更改。当我认为可以为您的所有担忧找到解决方案时,听起来您似乎根本不想探索这条路线。