2016-09-28 126 views
2

我有一些列使用bit数据类型。最终用户现在想要一个N/A选项,所以之前我用一点来捕获“是/否”(1为yes,0为no),现在我需要有三个选项是/否/ NA,我可以存储就像varchar中的文字一样。将位数据类型转换为SQL Server中的VarChar

是否有办法将列的数据类型从bit更改为varchar并更新当前记录数据,其中任何0的状态变为“否”,1的状态变为“是”?

回答

8

为什么不使用NULL来表示“不适用”?

否则使用TINYINT与包含值0,1和2(或可能是1,2和3)及其含义的查找表。然后在两个表之间添加FK以强制只输入这些值。

最后选择将与CHAR(1)列一起去。如果您还指定了二进制排序规则,例如Latin1_General_100_BIN2,那么这将是确定的。二进制整理将使其不会失去其他两个选项的性能。如果没有二进制排序规则,字符串列会根据语言规则比较值,这会花费额外的时间,但对此用法没有意义。您还需要一个AFTER INSERT, UPDATE为了保持一致性,先触发此值为UPPER(),然后强制执行所有值为Y,NA(对于“n/a”)。这比0,1和2(通过TINYINT)更具可读性,对于搜索同样有效,并且也只有1个字节,但BUT的使用只需要记住只指定大写字母,否则它们可能不会获得预期的结果。

有一个在所有没有理由使用VARCHAR(3)并存储满值N/A/Yes/No,除非你只是不关心系统越来越慢;-)。

+2

+1000这个。有点数据类型没有2个值,它有3.1,0和NULL。 –

+1

伟大的想法和最简单的实现,因为我可以离开数据库,只是改变代码。谢谢! –

+1

@SeanLange谢谢:)。不知道你是否曾经与SilverLight开发/ XAML混淆过,但那是我看到他们提供三元布尔复选框作为表单元素的唯一环境。你实际上可以检查它,取消选中,然后取消设置!取消设置将是复选框中的大部分阴影,与复选标记明显不同。这很不错。 –

0
  1. 添加一个新的VARCHAR列它基于现有位列
  2. 更新删除位列
  3. (optionaly)重命名新列老列的名称
0

其实CHAR(3)会更节省空间

或使用TINYINT与FK表由scutzly

我已经死了的建议是死感到惊讶,但我能只是转换位为char(3 )在SSMS中右键单击设计。

0
Alter Table TableName 
Alter Column ColumnName Varchar(3) 

Update TableName 
Set ColumnName = 'Yes' 
Where ColumnName = '1' 

Update TableName 
Set ColumnName = 'No' 
Where ColumnName = '0' 
+0

我不会失望,但我会指出,进行此更改绝对没有任何好处,事实上,它会减慢对此字段的查询速度,并且需要在磁盘和缓冲池中占用更多空间。 –

相关问题