我很难理解为什么将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
?
SQL Fiddle
执行SELECT @a
时,将向某个客户端(例如SQL Server Management Studio(返回一个结果集,该结果集由float
类型的单列组成。然后由该工具在其编程环境中使用其认为合适的任何选项将float
转换为string
。
将@a
指定给@b
时,将强制执行从float
到varchar(10)
的隐式转换SQL Server决定如何执行此转换,然后在第二个结果集中将数据发送到客户端工具。客户端工具很可能很少或根本不进行操作,因为在某种程度上,它已经是一个字符串了。
所以你有两个不同的东西在运行转换。SQL Server Management Studio1通常会选择与SQL Server本身选择的转换类似的转换,但正如您在这里的测试用例中观察到的那样,这绝不能保证。
1假设为人们提出此类问题的通常起点。但同样适用于SQL Fiddle。@b
到字符串的转换由SQL Server控制。@a
转换是由SQL Fiddle应用程序中的一些代码执行的。这可能是SQL Fiddle内置的语言/框架,也可能是一些自定义代码。没关系。关键的区别在于,它是由(可能(不同的作者编写的不同的代码,他们对特定的转换是什么有不同的看法,使成为明智的