解决方案 #2:
您可以使用 Isnull 链执行类似的操作,以根据某些主键关联将信息拉回。在不知道您的实现的情况下,我不知道这将是多么愚蠢的建议,但这是一种以所需格式将输入存储在后端的方法。
/*
Create Table #test
(
tID Int Identity,
StringVal Varchar(100),
FloatVal Float,
BoolVal Bit,
IntVal Int
)
*/
Declare @bah Varchar(100)
Set @bah = 'ValuesToTest'
If IsNumeric(@bah) = 0
Begin
If @bah In ('true','false') --Went with this assumption otherwise you'd get confused between 1 bool and 1 int
Begin
Insert #test (BoolVal)
Select Case
When @bah = 'true' Then 1
Else 0
End
End
Else
Begin
Insert #test (StringVal)
Select @bah
End
End
Else If Floor(Convert(Money,@bah)) <> Ceiling(Convert(Money,@bah)) --Compensate for IsNumeric interpretation of money
Begin
Insert #test (FloatVal)
Select Convert(Float,Convert(Money,@bah))
End
Else
Begin
Insert #test (IntVal)
Select Convert(Int,@bah)
End
您的值列的基线将是 1 个字节以允许可空值,1 个字节用于位列,4 个字节用于 int 列,4 个字节用于浮点数和 2 个字节用于 varchar(对于变量长度存储)所以看起来您正在查看 15 个字节的基线。
如果它是位或整数(15 字节)将是您的存储需求,如果它是双精度,则它可能会增加 4 个字节,如果精度为 25 或更高,并且 varchar 会增加等于长度的字节数正在存储的记录。因此,如果您改为使用不可为空的 varchar,则每条记录最多可为您节省 12 个字节(可变长度存储最少为 2 个字节,单个字符值最少为 1 个字节)。因此,对于 1,000,000 条记录,您正在查看大约 11.5 MB 的额外数据存储空间。
但是,如果您要根据值查找主键,则使用此解决方案可能会更快,因为在 varchar 上查找位、int 或 float 索引值会更快,所以如果在执行您的查找后,您将知道要使用哪种数据类型,走这条路会更快,因为只要您的列被索引,您就可以忽略所有在不同列中具有值的 Null。如果您要根据主键获取值,请使用单个 varchar 列,因为好处可以忽略不计。