我有一些列使用bit
数据类型。最终用户现在想要一个N/A选项,所以之前我用一点来捕获“是/否”(1为yes,0为no),现在我需要有三个选项是/否/ NA,我可以存储就像varchar
中的文字一样。将位数据类型转换为SQL Server中的VarChar
是否有办法将列的数据类型从bit
更改为varchar
并更新当前记录数据,其中任何0的状态变为“否”,1的状态变为“是”?
我有一些列使用bit
数据类型。最终用户现在想要一个N/A选项,所以之前我用一点来捕获“是/否”(1为yes,0为no),现在我需要有三个选项是/否/ NA,我可以存储就像varchar
中的文字一样。将位数据类型转换为SQL Server中的VarChar
是否有办法将列的数据类型从bit
更改为varchar
并更新当前记录数据,其中任何0的状态变为“否”,1的状态变为“是”?
为什么不使用NULL
来表示“不适用”?
否则使用TINYINT
与包含值0,1和2(或可能是1,2和3)及其含义的查找表。然后在两个表之间添加FK以强制只输入这些值。
最后选择将与CHAR(1)
列一起去。如果您还指定了二进制排序规则,例如Latin1_General_100_BIN2
,那么这将是确定的。二进制整理将使其不会失去其他两个选项的性能。如果没有二进制排序规则,字符串列会根据语言规则比较值,这会花费额外的时间,但对此用法没有意义。您还需要一个AFTER INSERT, UPDATE
为了保持一致性,先触发此值为UPPER()
,然后强制执行所有值为Y
,N
或A
(对于“n/a”)。这比0,1和2(通过TINYINT
)更具可读性,对于搜索同样有效,并且也只有1个字节,但BUT的使用只需要记住只指定大写字母,否则它们可能不会获得预期的结果。
有一个在所有没有理由使用VARCHAR(3)
并存储满值N/A
/Yes
/No
,除非你只是不关心系统越来越慢;-)。
其实CHAR(3)会更节省空间
或使用TINYINT与FK表由scutzly
我已经死了的建议是死感到惊讶,但我能只是转换位为char(3 )在SSMS中右键单击设计。
Alter Table TableName
Alter Column ColumnName Varchar(3)
Update TableName
Set ColumnName = 'Yes'
Where ColumnName = '1'
Update TableName
Set ColumnName = 'No'
Where ColumnName = '0'
我不会失望,但我会指出,进行此更改绝对没有任何好处,事实上,它会减慢对此字段的查询速度,并且需要在磁盘和缓冲池中占用更多空间。 –
+1000这个。有点数据类型没有2个值,它有3.1,0和NULL。 –
伟大的想法和最简单的实现,因为我可以离开数据库,只是改变代码。谢谢! –
@SeanLange谢谢:)。不知道你是否曾经与SilverLight开发/ XAML混淆过,但那是我看到他们提供三元布尔复选框作为表单元素的唯一环境。你实际上可以检查它,取消选中,然后取消设置!取消设置将是复选框中的大部分阴影,与复选标记明显不同。这很不错。 –