SQL Server 2005中 "select 123.866" 的数据类型是什么?

3
如果我只是写了一些类似于这样的内容:
select 10.00; 

这会给我哪种类型?

这是我进行的一个测试,用于测试这些类型的二进制表示。最大的惊喜在于没有一个转换实际匹配第一行!

select cast(123.866 as binary) union all 
select cast(cast(123.866 as real) as binary) union all 
select cast(cast(123.866 as float) as binary) union all 
select cast(cast(123.866 as decimal) as binary) union all 
select cast(cast(123.866 as numeric) as binary) union all 
select cast(cast(123.866 as money) as binary) union all 
select cast(cast(123.866 as smallmoney) as binary)

--------------
0x0000000000000000000000000000000000000000000006030001DAE30100
0x000000000000000000000000000000000000000000000000000042F7BB64
0x00000000000000000000000000000000000000000000405EF76C8B439581
0x00000000000000000000000000000000000000000000120000017C000000
0x00000000000000000000000000000000000000000000120000017C000000
0x00000000000000000000000000000000000000000000000000000012E684
0x00000000000000000000000000000000000000000000000000000012E684

有人能解释一下这个吗?


最初,我只是想避免编写转换语句,假设123.866隐式为十进制。所以我想测试这两个语句是否相同:

select cast(123.866 as decimal) 
select 123.866 
4个回答

8

除了@David M的回答之外,这里有一种直接查找类型的方法,参见:less than dot: How to implement a typeof operator in SQL by using sql_variant_property

select
    CAST(SQL_VARIANT_PROPERTY(123.866, 'BaseType') AS VARCHAR(20)) AS Type,
    CAST(SQL_VARIANT_PROPERTY(123.866, 'Precision') AS INT) AS Precision,
    CAST(SQL_VARIANT_PROPERTY(123.866, 'Scale') AS INT) AS Scale

这给我带来了这样的答案:
Type     Precision  Type
numeric  6          3

请注意,我是在 SQL Server 2008 上测试的,不是在 2005 上。希望该函数在 2005 中可用。 numeric 的详细说明在这里:数据类型 (Transact SQL)decimal and numeric (Transact-SQL)

在SS2005中有相同的结果,因此该函数在那里存在。 - DaveE

6

这个值被隐式定义为decimal(6,3)类型 - 强制转换成这个类型,你会看到二进制值匹配。它似乎使用最小的decimal类型来适应这个值 - 在这种情况下,包括小数点后3位的6位数字。


好的,这就是答案。您从哪里获取了这些信息? - Jeff Meatball Yang
从所呈现的二进制中做出有根据的猜测,其中包含0603十六进制,然后是整数值123866的二进制表示,顺序相反。然后在管理工作室中进行验证。 - David M

1

在你的测试中,你正在使用union all。你知道在联合查询中所有值都将被转换为相同的数据类型吗?

SQL Server精度和比例问题

本文还演示了当你将不同的数据类型组合在一起时会发生什么。


我知道结果都是同一种类型,但那种类型是二进制的。因此,比较的是各个输入值的二进制表示。我使用的基本原理是,如果两个值是相同类型的,则它们具有相同的二进制表示。 - Jeff Meatball Yang

0
你确定在查询中需要强制转换吗?当你选择结果后,下一步要处理什么?如果是应用程序,代码应该正确地确定并转换类型(如果需要)。如果是另一个查询,你可能可以毫无问题地将其传递。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接