当从varchar自动转换为int时,为什么9.9中有限制



我在SQL Server中尝试了以下操作:

SELECT '10.1' as Col
UNION
SELECT 5.1

^这不起作用,但是:

SELECT '5.1' as Col
UNION
SELECT 10.1

^这是有效的。

我在第一个值中尝试了不同的数字,显然所有小于9.9的值都有效。所有大于9.9的值都无效。

这一切都与数据类型优先级和隐式转换有关。查询中有两种不同的数据类型:varchardecimal,但它们的长度、精度和小数位数属性都不同。

在第一个查询中,您有一个varchar(4)decimal(2,1)decimal的数据类型优先级高于varchar,因此后者被隐式转换为前者。然而,10.1对于decimal(2,1)来说太大,因此会发生错误。实际上,正在发生的是CONVERT(decimal(2,1),'10.1'),它也失败了。decimal(2,1)可以存储的最大数字是9.9

对于后一个查询,这是因为10.1decimal(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

则不会出现错误

最新更新