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

Jef*_*ang 3 sql-server types casting sql-server-2005

如果我只是写类似的东西

select 10.00; 
Run Code Online (Sandbox Code Playgroud)

这给了我什么类型的?

这是我运行的测试,用于测试这些类型的二进制表示.这里最大的惊喜是没有一个演员实际上与第一排匹配!

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
Run Code Online (Sandbox Code Playgroud)

有谁能解释一下?


最初,我想要做的就是避免编写演员声明,假设123.866隐式为小数.所以我想测试这两个语句是否相同:

select cast(123.866 as decimal) 
select 123.866 
Run Code Online (Sandbox Code Playgroud)

ang*_*son 8

除了@David M的回答之外,这里有一种直接找到类型的方法,在这里找到:小于点:如何使用sql_variant_property在SQL中实现typeof运算符:

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
Run Code Online (Sandbox Code Playgroud)

这给了我这个答案:

Type     Precision  Type
numeric  6          3
Run Code Online (Sandbox Code Playgroud)

请注意,我在SQL Server 2008上测试了这个,而不是2005年.我希望该功能在2005年可用.

numeric这里进一步描述:数据类型(Transact SQL),这里:十进制和数字(Transact-SQL).


Dav*_*d M 6

它隐式输入为十进制(6,3) - 强制转换为此值,您将看到二进制值匹配.它似乎在最小的tpe使用十进制来拟合值 - 在这种情况下,6位数包括小数点后的3位数.