【问题标题】:Adding an extra column and constraint but then when updating the column it fails添加额外的列和约束,但是在更新列时失败
【发布时间】:2018-09-23 05:02:40
【问题描述】:

我正在尝试在 SSMS 中的 SQL Server 2008 上运行以下查询,但是在第三个查询中它不断失败,说明: 列名“hasCodeMappingDefaults”无效。

BEGIN
ALTER TABLE [SIntegrationProvider]
ADD [hasCodeMappingDefaults] BIT NULL;
END

BEGIN
ALTER TABLE [SIntegrationProvider]
ADD CONSTRAINT [DF_SIntegrationProvider_hasCodeMappingDefaults]  DEFAULT ((1)) FOR [hasCodeMappingDefaults];
END

BEGIN
UPDATE [SIntegrationProvider]
SET [hasCodeMappingDefaults] = 1
WHERE [provider] = 'EmployeeNavigator';
END

当每个查询单独运行以便它们工作时,我无法弄清楚为什么我不能同时运行所有三个(这需要作为正在推出的更大脚本的一部分来完成)。

【问题讨论】:

  • 你需要对每个命令都提交吗?
  • 我认为我需要以正确的顺序执行并正确编译。

标签: sql sql-server-2008 sql-update sql-server-2014 alter-table


【解决方案1】:

其实我想我可能已经找到了问题,这样做似乎解决了问题:

ALTER TABLE [SIntegrationProvider]
ADD [hasCodeMappingDefaults] BIT NULL
GO

ALTER TABLE [SIntegrationProvider]
ADD CONSTRAINT [DF_SIntegrationProvider_hasCodeMappingDefaults]  DEFAULT ((1)) FOR [hasCodeMappingDefaults]
GO

-- Set the new value for ENav
IF EXISTS(SELECT COLUMN_NAME
      FROM   INFORMATION_SCHEMA.COLUMNS
      WHERE  TABLE_NAME = 'SIntegrationProvider'
             AND COLUMN_NAME = 'hasCodeMappingDefaults') 
UPDATE [SIntegrationProvider]
SET [hasCodeMappingDefaults] = 1
WHERE [provider] = 'EmployeeNavigator';

【讨论】:

  • 你没有解决问题。您只需进行错误处理并避免错误消息。您将默认值设置为 1,因此即使没有更新,该列的所有值都是 1
  • 不太清楚你的意思?我的假设是,当它到达第三部分查询时,它还没有完全提交数据。因此,通过将 IF EXISTS 放在那里,它将重新编译并识别该列已被添加,从而允许 UPDATE。这不正确吗?
  • 如果因为列不存在而报错,则 if 子句为假,不会执行更新命令。你放了一个代码来不解决根本原因。根本原因是更改表后找不到该列的原因。同样,您没有修复某些东西。你修复你的代码不返回错误。
猜你喜欢
  • 2021-11-16
  • 1970-01-01
  • 2019-12-06
  • 2016-05-23
  • 2020-10-04
相关资源
最近更新 更多