【问题标题】:Why in sql server can't return proper error in decimal data type conversion? [duplicate]为什么在 sql server 中无法在十进制数据类型转换中返回正确的错误? [复制]
【发布时间】:2020-04-02 17:19:10
【问题描述】:

当我像这样写查询时

Select 3 + '44. 5'

将 varchar 值转换为 '44 时出现错误转换失败。 6' 转数据类型 int

为什么它不能返回正确的错误,因为小数不能转换为 int。

【问题讨论】:

  • 用单引号将数字括起来 '' 使其成为字符串,而不是数字。
  • 数据类型优先级 Select 3 + '44. 5' => 转换为 INT,select 3.0 + '44. 5' => 转换为数字。 '44. 5' 是无效的 INT/数字文字
  • 因为这不是正确的错误。 SELECT 3 + 44.5 可以正常工作,因为 INT 可以提升为 DECIMALSELECT 3.0 + '44. 5' 将给出关于 VARCHAR 未转换为 NUMERIC 的错误。在任何情况下保存溢出都不会在将DECIMAL 转换为INT 时出错,因为允许这种转换(隐式舍入)。
  • ^ 如果它是一个有效的数字文字 44.5,您仍然会收到“将 varchar 转换为数字数据类型的算术溢出错误”,因为 3.0 会将表达式类型设置为numeric(2,1) 和 44.5 是 numeric(3,1)

标签: sql-server tsql casting string-concatenation


【解决方案1】:

去掉单引号。引号表示它是字符串值而不是实数值。

SELECT 3 + 44.5

【讨论】:

    【解决方案2】:

    您可能需要两种可能的输出:47.5 作为数字,或 344.5 作为字符串:

        SELECT 3 +  CAST( '44.5' as decimal(3,1))
    

    或者...

        SELECT CONCAT(CAST(3 as varchar), '44.5')
    

    【讨论】:

      【解决方案3】:

      首先,这个页面会告诉你关于这个话题你需要知道的一切(并且可以用来治疗失眠):Data type conversion (Database Engine)

      接下来,您发布的是无法转换为数字的'44. 5'。无论您尝试哪种数字数据类型,这都会失败:

      SELECT CAST('44. 5' AS NUMERIC)
      

      这将失败,因为 SQL 无法确定您是在聚合数字还是连接文本:

      Select 3 + '44.6';
      

      这些适用于数学:

      Select 3 + 44.5;
      Select 3 + CAST('44.5' AS DECIMAL(3,1));
      Select CAST(3 AS DECIMAL(3,1)) + '44.5';
      

      这些将适用于连接:

      Select '3' + '44.5';
      Select CAST(3 AS VARCHAR(10)) + '44.5'
      Select CONCAT(3, '44.5');
      

      【讨论】:

      • 第二种情况的“SQL 无法确定是聚合数字还是连接文本”的语句不正确。隐式提升规则意味着 SQL Server 将尝试将 44.6 转换为 INT3 的类型),但由于不允许使用小数点而失败。在那里尝试的内容没有混淆(至少对引擎而言):SELECT 3 + '44' 是允许的,并且是明确的47,而不是344(请注意,操作数的顺序对于键入无关紧要:@ 987654333@ 也是47)。
      • @JeroenMostert - 同意。感谢您的更正。我在表达我想说的话时做得很糟糕。我的意思是,OP 的语法没有正确地告诉 SQL 引擎他们试图做什么。
      猜你喜欢
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      相关资源
      最近更新 更多