我在SQL Server中尝试了以下操作:
SELECT '10.1' as Col
UNION
SELECT 5.1
^这不起作用,但是:
SELECT '5.1' as Col
UNION
SELECT 10.1
^这是有效的。
我在第一个值中尝试了不同的数字,显然所有小于9.9的值都有效。所有大于9.9的值都无效。
这一切都与数据类型优先级和隐式转换有关。查询中有两种不同的数据类型:varchar
和decimal
,但它们的长度、精度和小数位数属性都不同。
在第一个查询中,您有一个varchar(4)
和decimal(2,1)
。decimal
的数据类型优先级高于varchar
,因此后者被隐式转换为前者。然而,10.1
对于decimal(2,1)
来说太大,因此会发生错误。实际上,正在发生的是CONVERT(decimal(2,1),'10.1')
,它也失败了。decimal(2,1)
可以存储的最大数字是9.9
。
对于后一个查询,这是因为10.1
是decimal(3,1)
。CCD_ 14可以很容易地适应于CCD_。
然而,真正应该做的是确保UNION (ALL)
中的所有数据集返回相同的数据类型。然后你就不必处理隐式转换,以及它们可能导致的错误:
SELECT CONVERT(decimal(3,1),'10.1') as Col
UNION ALL
SELECT 5.1;
当不同类型的数据必须放在一个地方时,数据类型优先级规则决定将使用这两种类型中的哪一种。
在第一个示例中,系统必须在char(4)
和numeric(2,1)
之间进行选择。它选择了CCD_ 19,而CCD_。它不做的是决定一个合适的类型来将字符串转换为(比如numeric(3,1)
(,然后合并这些类型。
在第二个示例中,5.1
将适合numeric(3,1)
。
当然,说将varchar转换为int有9.9的限制是不对的,因为a(我们转换为数字,而不是int,b(如果你在第一个例子中增加了数字的大小:
SELECT '10.1' as Col
UNION
SELECT 50.1
则不会出现错误