目前我有一个数据库,它将布尔字段存储为VARCHAR(1)('T'或'F')。我想用BIT替换它们。问题是这需要对使用数据库的程序进行大量更改。所以我认为逻辑步骤是添加一个BIT字段并用我访问的计算列替换现有的VARCHAR(1)字段而不是访问BIT字段(因此程序可以继续按原样工作而不需要更改,并且可以更改随着时间的推移使用BIT字段。
我知道这不起作用(UPDATE和INSERT不适用于计算列)。我知道一个选项是重命名现有表并添加一个视图来访问它,但我不认为这是一个可行的解决方案,因为添加和删除列,更改相关视图等会容易出错(在我看来,这不是一个简洁的解决方案。)
我的问题是 - 我有什么选择来实现上述行为(这样程序可以继续按原样运行)?
一个例子:
User (Active VARCHAR(1), ...)
更改为使用计算列:(将无效)
User (Active_B BIT, Active AS CASE Active_B WHEN 1 THEN 'T' ELSE 'F' END, ...)
更新:修复了示例中的错误。
答案 0 :(得分:1)
必须是:
ALTER TABLE dbo.User
ADD Active AS CASE Active_B WHEN 1 THEN 'T' ELSE 'F' END PERSISTED
您需要使用CASE
中的列名称(不是数据类型)。我建议将计算列持久化 - 以便将值实际存储在磁盘上(每次访问时都不会重新计算)。
答案 1 :(得分:0)
一个选项是同时拥有VARCHAR和BIT字段,并使用触发器在它们之间进行更新。
我只需要弄清楚如何防止无限递归(一个想法是让一个字段除了用于检查此触发器是否由另一个触发器内的更新产生之外没有其他用途(检查我们是否正在更新它)并将其包含在触发器的更新中))。更新需要采用两种方式,以便于向后兼容。