我正在生成一个脚本,用于将更改从多个开发数据库自动迁移到暂存/生产。基本上,它需要一堆更改脚本,并将它们合并为一个脚本,将每个脚本包装在 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 块中创建和更新同一列?

最佳答案

我遇到了同样的问题,最后设法使用 SET NOEXEC 解决了它。

IF not whatever
BEGIN
    SET NOEXEC ON;
END

ALTER TABLE dbo.EMPLOYEE ADD COLUMN EMP_IS_ADMIN BIT NOT NULL
GO
UPDATE dbo.EMPLOYEE SET EMP_IS_ADMIN = whatever

SET NOEXEC OFF;

关于sql - TSQL - 如何在 BEGIN .. END 块中使用 GO?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6376866/

10-13 07:46