在 SQL 服务器中将位数据类型转换为 VarChar

Convert bit datatype to VarChar in SQL Server

我有一些列使用 bit 数据类型。最终用户现在想要一个 N/A 选项,所以在我使用位捕获 "Yes/No" 之前是什么(1 是,0 不是)我现在需要三个选项 Yes/No/NA 我可以像文本一样存储在 varchar.

有没有一种方法可以将列的数据类型从 bit 更改为 varchar 并更新当前记录数据,其中任何 0 我更改为 "No",1 我更改到 "Yes"?

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

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

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

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

完全没有理由 使用 VARCHAR(3) 并存储完整值 N/A / Yes / No , 除非你不关心系统变慢 ;-).

实际上 char(3) 会更 space 高效

或按照 scutzly

的建议将 tinyint 与 FK table 一起使用

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

Alter Table TableName
Alter Column ColumnName Varchar(3)

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

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