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 为 运行 之前,因此不是输入第二个 IF
,none 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
起个名字,也是个好习惯。
以下是我的代码
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 为 运行 之前,因此不是输入第二个 IF
,none 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
起个名字,也是个好习惯。