代码之家  ›  专栏  ›  技术社区  ›  Krishna Kumar

varchar到numeric的隐式工作到999年之后就不工作了

  •  1
  • Krishna Kumar  · 技术社区  · 14 年前

    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。

    1 回复  |  直到 14 年前
        1
  •  3
  •   Guffa    14 年前

    通过将字符串与数字相乘,可以隐式地将其转换为数字。与之相乘的数字的类型决定字符串转换为的类型。数据库使用最小的 numeric 可以保存号码的类型 100.00 numeric(5,2) ,所以字符串也被转换为。

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

    例如,如果您将其转换为 int 它可以处理多达 '2147483647' :

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