Sql server 2005 隐式varchar到numeric如何工作到999年,并且在999年之后不再工作

Sql server 2005 隐式varchar到numeric如何工作到999年,并且在999年之后不再工作,sql-server-2005,Sql Server 2005,下面的sql工作: DECLARE @VAL1 VARCHAR(50), @VAL2 INT SET @VAL1 = '999' SET @VAL2 = 6414 SELECT ROUND(CAST(((@VAL1 * 100.00)/@VAL2) AS FLOAT), 2) 其中,由于“将varchar转换为数据类型numeric时出现算术溢出错误”,此操作失败 DECLARE @VAL1 VARCHAR(50), @VAL2 INT SET @VAL1 = '1000' SET @VAL2

下面的sql工作:

DECLARE @VAL1 VARCHAR(50), @VAL2 INT
SET @VAL1 = '999'
SET @VAL2 = 6414
SELECT ROUND(CAST(((@VAL1 * 100.00)/@VAL2) AS FLOAT), 2)
其中,由于“将varchar转换为数据类型numeric时出现算术溢出错误”,此操作失败

DECLARE @VAL1 VARCHAR(50), @VAL2 INT
SET @VAL1 = '1000'
SET @VAL2 = 6414
SELECT ROUND(CAST(((@VAL1 * 100.00)/@VAL2) AS FLOAT), 2)

两者之间的唯一区别是,在第二个字符串中@VAL1的值是1000而不是999。

通过将字符串与数字相乘,将字符串隐式转换为数字。与之相乘的数字的类型决定字符串转换为的类型。数据库使用最小的
numeric
类型,该类型可以保存数字
100.00
,即
numeric(5,2)
,因此字符串也会转换为该类型

如果显式地将字符串转换为数字,则可以选择能够处理所需范围的类型

例如,如果将其转换为
int
,则它最多可以处理
'2147483647'
的值:

SELECT ROUND(CAST(((CAST(@VAL1 AS INT) * 100.00)/@VAL2) AS FLOAT), 2)