如果列存在,则有条件地插入 table
Conditionally insert into table if column exists
我正在尝试编写一个幂等数据库迁移脚本,除其他外,它需要随机播放一些数据。在脚本的后面,我从中选择的列之一被删除(迁移的目的是将数据从该列移动到新位置),所以我有这样的东西(由 EF Core 生成):
IF NOT EXISTS (SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'AName')
BEGIN
INSERT INTO Foos (A, B)
SELECT OldA, OldB FROM Bars
END
-- a little later in the script:
IF NOT EXISTS (SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'AnotherName')
BEGIN
ALTER TABLE [Bars] DROP COLUMN [OldB];
END
但是,这并不像我希望的那样幂等;我第二次 运行 脚本时,第一个 INSERT
语句失败并出现错误,因为 OldB
列在 Bars
上不再存在。
然而,如果 OldB
被删除,上面的保护子句将 总是 为假,因为在删除 OldB
的同时,我们也将该行插入到迁移历史记录中(是的,我已经检查过现在也是如此;该行存在)。所以 INSERT
应该 never 运行 没有它关心的所有列存在。
我如何编写一个像上面那样的幂等 INSERT
,直到它实际上 运行 才验证所有列的存在?
您可以检查是否所有列都存在:
IF NOT EXISTS (SELECT * FROM [__EFMigrationsHistory]
WHERE [MigrationId] = N'AName')
BEGIN
IF (SELECT COUNT(*)
FROM sys.columns
WHERE [object_id] = OBJECT_ID('Bars')
AND name IN ('OldA', 'OldB')) = 2
BEGIN
EXEC('INSERT INTO Foos (A, B)
SELECT OldA, OldB FROM Bars');
END
END
-- a little later in the script:
IF NOT EXISTS (SELECT * FROM [__EFMigrationsHistory]
WHERE [MigrationId] = N'AnotherName')
BEGIN
EXEC('ALTER TABLE [Bars] DROP COLUMN [OldB]');
END
我正在尝试编写一个幂等数据库迁移脚本,除其他外,它需要随机播放一些数据。在脚本的后面,我从中选择的列之一被删除(迁移的目的是将数据从该列移动到新位置),所以我有这样的东西(由 EF Core 生成):
IF NOT EXISTS (SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'AName')
BEGIN
INSERT INTO Foos (A, B)
SELECT OldA, OldB FROM Bars
END
-- a little later in the script:
IF NOT EXISTS (SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'AnotherName')
BEGIN
ALTER TABLE [Bars] DROP COLUMN [OldB];
END
但是,这并不像我希望的那样幂等;我第二次 运行 脚本时,第一个 INSERT
语句失败并出现错误,因为 OldB
列在 Bars
上不再存在。
然而,如果 OldB
被删除,上面的保护子句将 总是 为假,因为在删除 OldB
的同时,我们也将该行插入到迁移历史记录中(是的,我已经检查过现在也是如此;该行存在)。所以 INSERT
应该 never 运行 没有它关心的所有列存在。
我如何编写一个像上面那样的幂等 INSERT
,直到它实际上 运行 才验证所有列的存在?
您可以检查是否所有列都存在:
IF NOT EXISTS (SELECT * FROM [__EFMigrationsHistory]
WHERE [MigrationId] = N'AName')
BEGIN
IF (SELECT COUNT(*)
FROM sys.columns
WHERE [object_id] = OBJECT_ID('Bars')
AND name IN ('OldA', 'OldB')) = 2
BEGIN
EXEC('INSERT INTO Foos (A, B)
SELECT OldA, OldB FROM Bars');
END
END
-- a little later in the script:
IF NOT EXISTS (SELECT * FROM [__EFMigrationsHistory]
WHERE [MigrationId] = N'AnotherName')
BEGIN
EXEC('ALTER TABLE [Bars] DROP COLUMN [OldB]');
END