在 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"?
- 添加一个新的 varchar 列
- 根据现有位列更新
- 删除位列
- (可选)将新列重命名为旧列的名称
为什么不直接使用 NULL
来表示 "n/a"?
否则使用 TINYINT
查找 table 包含值 0、1 和 2(或者可能是 1、2 和 3)及其含义。然后在两个 table 之间添加一个 FK 以强制只输入这些值。
last 选择是使用 CHAR(1)
列。仅当 您还指定了二进制排序规则,例如 Latin1_General_100_BIN2
时,这才可以 。二进制排序规则将使您不会失去其他两个选项的性能。如果没有二进制排序规则,字符串列会将值与语言规则进行比较,这需要额外的时间但对于这种用法没有意义。您还需要一个 AFTER INSERT, UPDATE
触发器来首先 UPPER()
这个值以保持一致性,然后强制所有值都是 Y
、N
或 A
(对于 "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'
我有一些列使用 bit
数据类型。最终用户现在想要一个 N/A 选项,所以在我使用位捕获 "Yes/No" 之前是什么(1 是,0 不是)我现在需要三个选项 Yes/No/NA 我可以像文本一样存储在 varchar
.
有没有一种方法可以将列的数据类型从 bit
更改为 varchar
并更新当前记录数据,其中任何 0 我更改为 "No",1 我更改到 "Yes"?
- 添加一个新的 varchar 列
- 根据现有位列更新
- 删除位列
- (可选)将新列重命名为旧列的名称
为什么不直接使用 NULL
来表示 "n/a"?
否则使用 TINYINT
查找 table 包含值 0、1 和 2(或者可能是 1、2 和 3)及其含义。然后在两个 table 之间添加一个 FK 以强制只输入这些值。
last 选择是使用 CHAR(1)
列。仅当 您还指定了二进制排序规则,例如 Latin1_General_100_BIN2
时,这才可以 。二进制排序规则将使您不会失去其他两个选项的性能。如果没有二进制排序规则,字符串列会将值与语言规则进行比较,这需要额外的时间但对于这种用法没有意义。您还需要一个 AFTER INSERT, UPDATE
触发器来首先 UPPER()
这个值以保持一致性,然后强制所有值都是 Y
、N
或 A
(对于 "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'