0

以下是我的代码

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'

有人可以帮忙吗?

4

1 回答 1

2

如果表中还没有该列isDisplayed,则整个批处理将失败,因为解析器将生成 Invalid column name 错误。这发生在任何 SQL 运行之前,所以不是第二个IF正在输入,根本没有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以及这只是一个好习惯。

于 2021-12-10T12:03:37.210 回答