在SQL Server中将位数据类型转换为VarChar

时间:2016-09-28 20:04:26

标签: sql sql-server ssms

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

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

4 个答案:

答案 0 :(得分:8)

为什么不用NULL来表示" n / a"?

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

last 选项将使用CHAR(1)列。只有您还指定了二进制排序规则(例如Latin1_General_100_BIN2)时,这将是正常的。二进制排序规则将使您不会失去其他两个选项的性能。如果没有二进制排序规则,字符串列会将值与语言规则进行比较,这些规则需要额外的时间,但对此用法没有任何意义。为了保持一致性,您还需要AFTER INSERT, UPDATE触发器首先UPPER()此值,然后强制所有值都是YNA (对于" n / a")。这比0,1和2(通过TINYINT)更具可读性,并且同样有效地进行搜索,也只有1个字节,BUT使用时需要记住仅指定大写字母,否则它们可能不会得到预期的结果。

没有理由 使用VARCHAR(3)并存储完整的值N/A / Yes / No,除非你只是& #39; t关心系统变慢; - )。

答案 1 :(得分:0)

  1. 添加新的varchar列
  2. 根据现有位列
  3. 更新它
  4. 删除位列
  5. (optionaly)将新列重命名为旧列的名称

答案 2 :(得分:0)

实际上char(3)会更节省空间

或者像scutzly建议的那样使用带有FK表的tinyint

我死了很惊讶,但我可以在SSMS中通过右键设计将位转换为char(3)。

答案 3 :(得分: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'