SQL 多个 if 在 DbUp 上不 运行

SQL multiple if's not running on DbUp

以下是我的代码

IF NOT EXISTS  (SELECT 1 FROM sys.objects o INNER JOIN sys.columns c ON o.object_id = c.object_id
    WHERE
        o.name = 'portfolioAttributeCodes'
        AND c.name = 'isDisplayed'
)
BEGIN
    ALTER TABLE
        [cosmos].[portfolioAttributeCodes]
        ADD
        [isDisplayed] bit DEFAULT 1;
END
IF EXISTS  (SELECT 1 FROM sys.objects o INNER JOIN sys.columns c ON o.object_id = c.object_id
    WHERE
        o.name = 'portfolioAttributeCodes'
        AND c.name = 'isDisplayed')

BEGIN
    UPDATE [cosmos].[portfolioAttributeCodes] SET [isDisplayed] = 1;        
END

现在发生的事情是它不会创建列(跳过第一个 Id 语句并进入第二个并失败 Invalid column name 'isDisplayed'

有人可以帮忙吗?

如果 table 没有 isDisplayed 列,整个批处理将失败,因为解析器将生成无效的列名错误。这发生在任何 SQL 为 运行 之前,因此不是输入第二个 IFnone SQL 根本就是 运行。这实际上是一个编译错误(例如,当您尝试构建 C# 应用程序时,您引用了一个您尚未定义的对象)。

您不能在创建它的同一范围内引用 列。您需要使用 2 个批次或将对列的引用放在单独的范围内,以便延迟其验证。

延迟验证在这里似乎没问题:

IF NOT EXISTS (SELECT 1
               FROM sys.objects o
                    INNER JOIN sys.columns c ON o.object_id = c.object_id
               WHERE o.name = 'portfolioAttributeCodes'
                 AND c.name = 'isDisplayed')
BEGIN
    ALTER TABLE [cosmos].[portfolioAttributeCodes]
    ADD [isDisplayed] bit CONSTRAINT DF_isDisplayed DEFAULT 1 WITH VALUES;
END;
ELSE
BEGIN
    EXEC sys.sp_executesql N'UPDATE [cosmos].[portfolioAttributeCodes] SET [isDisplayed] = 1;';
END;

我也切换到 ELSE,因为在创建列后更新列没有什么意义;只需首先创建包含值的列。 我给DEFAULT CONSTRAINT起个名字,也是个好习惯。