我很难理解为什么将float转换为varchar会返回-0
而不是0
DECLARE @a FLOAT
SET @a = 0
SET @a= @a * -1
SELECT @a --return 0
DECLARE @b as VARCHAR(10)
SET @b=@a
SELECT @b -- this return -0
如您所见,以上代码将返回-0
。我当前的解决方法是将另一个强制转换添加为十进制,如下所示:
SET @a= cast(@a AS decimal(10,2)) *-1
我的问题是:为什么该代码返回-0
而不是0
?
答案 0 :(得分:2)
当您执行SELECT @a
时,您将返回一个结果集,该结果集由某些类型为float
的单列组成的客户端(例如SQL Server Management Studio)。然后,由该工具使用其在编程环境中认为合适的任何选项,将float
转换为string
。
将@a
分配给@b
时,将强制进行从float
到varchar(10)
的隐式转换。 SQL Server 决定如何执行此转换,然后将数据发送到第二个结果集中的客户端工具。客户端工具可能几乎不执行任何操作或完全不执行任何操作,因为在某种程度上它已经是字符串。
因此,您有两种不同的方式来进行转化。 SQL Server Management Studio 1 通常会 选择与SQL Server本身选择的转换类似的转换,但是它绝对不能保证 ,因为您在这里观察您的测试用例。
1 被认为是人们提出此类问题的通常起点。但是对于SQL Fiddle同样有效。 @b
到字符串的转换由SQL Server控制。 @a
转换是通过SQL Fiddle应用程序中的某些代码 执行的。这可能是内置于SQL Fiddle的语言/框架中的内容或某些自定义代码。没关系关键区别在于,这是由(可能)不同的作者(可能(可能))对明智的默认选择是什么构成的(可能)不同观点编写的不同代码。