【问题标题】:SQL Server conversion failed when converting the nvarchar value '-49.15' to data type int将 nvarchar 值“-49.15”转换为数据类型 int 时,SQL Server 转换失败
【发布时间】:2015-12-15 02:21:47
【问题描述】:

我收到了这个错误:

将 nvarchar 值“-49.15”转换为数据类型 int 时,SQL Server 转换失败

在我的案例陈述中。

[LINE1_OPEN_LOOP_VOLTAGE][LINE2_OPEN_LOOP_VOLTAGE] 都是 nvarchar 数据类型。

表中有负值、正值和空值。 我可以在 SELECT 语句之前将这些字段设置为 integer 吗?

CASE 
WHEN [LINE1_OPEN_LOOP_VOLTAGE]>= 0 OR [LINE2_OPEN_LOOP_VOLTAGE]>= 0 THEN 'YES'
WHEN [LINE1_OPEN_LOOP_VOLTAGE] IS NULL OR [LINE2_OPEN_LOOP_VOLTAGE] IS NULL THEN 'NO'
ELSE 'CHECK BUSINESS LOGIC'
END AS 'REVERSE POLARITY ISSUE',

【问题讨论】:

  • -49.15 不是整数值。
  • 请用您正在使用的 SQL Server 版本标记您的问题。

标签: sql sql-server case type-conversion sql-server-2014


【解决方案1】:

我认为您的值是浮点类型或数字类型(来自 nvarchar 值的 -49.15)。然后,您应该将 nvarchar 类型转换为浮点类型或数值类型。试试这样的:

DECLARE @LINE1_OPEN_LOOP_VOLTAGE NVARCHAR(10) = '-49.15'
DECLARE @LINE2_OPEN_LOOP_VOLTAGE NVARCHAR(10) = '49.15'
SELECT CASE 
    WHEN CONVERT(FLOAT, @LINE1_OPEN_LOOP_VOLTAGE) >= 0 -- OR NUMERIC
      OR CONVERT(FLOAT, @LINE2_OPEN_LOOP_VOLTAGE) >= 0 THEN 'YES'
    WHEN @LINE1_OPEN_LOOP_VOLTAGE IS NULL
      OR @LINE2_OPEN_LOOP_VOLTAGE IS NULL THEN 'NO'
    ELSE 'CHECK BUSINESS LOGIC'
    END AS 'REVERSE POLARITY ISSUE'

【讨论】:

  • -49.15 是一个变量...范围从 -50.00 到 +50.00(即 -46.15 或 +31.25)
  • 我现在没有收到错误,但没有得到想要的结果是或否...否定结果在应该为否时表明是。
  • 运气不好,因为你只能在声明变量中使用=
  • 我建议使用 numeric(5,2) 而不是 float - float 可能会给您带来可能难以调试的奇怪舍入问题,除非数据确实是浮点数据,否则应避免使用。
  • 我刚刚提取了 LINE1_OPEN_LOOP_VOLTAGE 的不同值,以下是一些值:0 0.01 -0.01 0.73 -0.73 46.62 -46.62 任何具有 0 或正结果的值都应标记为 YES,而任何
【解决方案2】:

只需将比较从整数更改为浮点数:

(CASE WHEN LINE1_OPEN_LOOP_VOLTAGE >= 0.0 OR LINE2_OPEN_LOOP_VOLTAGE >= 0.0
      THEN 'YES'
      WHEN LINE1_OPEN_LOOP_VOLTAGE IS NULL OR LINE2_OPEN_LOOP_VOLTAGE IS NULL
      THEN 'NO'
      ELSE 'CHECK BUSINESS LOGIC'
 END) AS [REVERSE POLARITY ISSUE],

在 SQL Server 2012+ 中,您可以使用try_convert()

(CASE WHEN try_convert(float, LINE1_OPEN_LOOP_VOLTAGE) >= 0.0 OR 
           try_convert(float, LINE2_OPEN_LOOP_VOLTAGE) >= 0.0
      THEN 'YES'
      WHEN LINE1_OPEN_LOOP_VOLTAGE IS NULL OR LINE2_OPEN_LOOP_VOLTAGE IS NULL
      THEN 'NO'
      ELSE 'CHECK BUSINESS LOGIC'
 END) AS [REVERSE POLARITY ISSUE],

【讨论】:

  • 谢谢,但我仍然收到错误:将数据类型 nvarchar 转换为数字时出错。
  • 在这种情况下,问题在于列中的无效数值。
  • 生产环境有几百万条记录,你建议删除这些错误记录吗?我提取了该字段的不同值,这里有一些示例 null 0 0.01 -0.01 46.45 -46.45
  • 我使用 try_convert 函数没有任何运气
【解决方案3】:

您的数据在某些时候会出现一些严重的问题 - 在基于文本的字段中存储整数会产生各种即时转换问题。如果你不能清理它,我们需要变得有点棘手并做出一堆假设,例如任何 NULL 都会打败任何数值。

我将假设您有某种 ID 可以查询,然后我将构建一个小表用于演示:

CREATE TABLE mynvarcharstuff (ID INTEGER, LINE1_OPEN_LOOP_VOLTAGE nvarchar(50), LINE2_OPEN_LOOP_VOLTAGE nvarchar(50))

INSERT INTO mynvarcharstuff VALUES (1, '-49.15', '-8.68'),  (2, '-49.15', NULL),    (3, '-18', '7.65'), (4, '26.5', '4')
,   (5, '49.15', NULL), (6, '25.3', '-12.4'),   (7, NULL, NULL),    (8, 'bob', '6.5'),  (9, ' 33', '')

使用 CTE(或临时表,如果您愿意)根据这些 ID 随时解决动态转换问题:

WITH numeric_ids AS (
    SELECT  ID
    ,       CASE WHEN (LINE1_OPEN_LOOP_VOLTAGE IS NULL OR LINE2_OPEN_LOOP_VOLTAGE IS NULL) THEN 1 ELSE 0 END AS CheckNull
    ,       CASE WHEN ISNUMERIC(LINE1_OPEN_LOOP_VOLTAGE) = 1 THEN 1 ELSE 0 END AS CheckLine1
    ,       CASE WHEN ISNUMERIC(LINE2_OPEN_LOOP_VOLTAGE) = 1 THEN 1 ELSE 0 END AS CheckLine2
    FROM    mynvarcharstuff
)
SELECT N.ID
, CASE
    -- If you move this line below either of the numeric checks, you potentially get errors - be careful!
    WHEN I.CheckNull = 1 THEN 'NO'  
    WHEN (I.CheckLine1 = 1 AND CONVERT(DECIMAL(5, 2), [LINE1_OPEN_LOOP_VOLTAGE]) >= 0.0) THEN 'YES'
    WHEN (I.CheckLine2 = 1 AND CONVERT(DECIMAL(5, 2), [LINE2_OPEN_LOOP_VOLTAGE]) >= 0.0) THEN 'YES'
    ELSE 'CHECK BUSINESS LOGIC'
  END AS 'REVERSE POLARITY ISSUE'
FROM mynvarcharstuff N
JOIN numeric_ids I ON I.ID = N.ID

由于我们不能即时转换列,我们需要首先检查它们是否能够被转换,然后查看它们是正数还是 NULL。

请注意,这不是一个完美的解决方案。如果你有关于 NULL 是否必须存在于 Line1 中的规则,如果它出现在 Line2 中,反之亦然,它可以工作。

但你最好用这样的方式清理数据:

DELETE
FROM    mynvarcharstuff
WHERE   (ISNUMERIC(LINE1_OPEN_LOOP_VOLTAGE) = 0 AND LINE1_OPEN_LOOP_VOLTAGE IS NOT NULL)
OR      (ISNUMERIC(LINE2_OPEN_LOOP_VOLTAGE) = 0 AND LINE2_OPEN_LOOP_VOLTAGE IS NOT NULL)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-17
    • 2011-08-29
    • 2015-06-20
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多