【问题标题】:Conversion failed when converting the varchar value 'none' to data type int将 varchar 值“无”转换为数据类型 int 时转换失败
【发布时间】:2016-08-30 07:41:04
【问题描述】:

我尝试了以下存储过程

ALTER PROCEDURE spvec
AS
SELECT Row_number() OVER (ORDER BY (SELECT 1)) AS 'RNumber'
    ,vf.*
FROM LOGIN ld
    ,vehicle vf
WHERE (ld.fid = vf.fid)
    AND ld.id <> 'NA'
    AND vf.CustID <> 'None'
    AND vf.Simo <> 'None'
ORDER BY Row_number() OVER (ORDER BY (SELECT 1))

行中没有文本和 NA 文本。例如没有空,但有没有值,NA 这里在哪里(ld.fid = vf.fid)

更新

ld.fid 是字符串 并且 vf.fid 在 int 中

所以我尝试转换

ALTER PROCEDURE spvec
AS
SELECT Row_number() OVER (ORDER BY (SELECT 1)) AS 'RNumber'
    ,vf.*
FROM LOGIN ld
    ,vehicle vf
WHERE  CAST((ld.FFID=vf.FFID) AS INT)
    AND ld.id <> 'NA'
    AND vf.CustID <> 'None'
    AND vf.Simo <> 'None'
ORDER BY Row_number() OVER (ORDER BY (SELECT 1))\

这显示更新时出现以下错误

关键字“AS”附近的语法不正确。

')' 附近的语法不正确。

它会在不更新的情况下引发以下错误

将 varchar 值 'none' 转换为数据类型 int 时转换失败。

【问题讨论】:

  • 您期待什么? 'none' 不是有效的整数值。
  • 行中没有文本和 NA 文本。例如没有空,但有没有值,NA
  • 看起来ld.idvf.CustID 是整数值,为什么要检查None 字符串值?
  • 顺便说一句:你使用的是 old-fashioned JOIN... 而不是 FROM tbl1,tbl2 WHERE tbl1.ID=tbl2.FKID 更好地使用 FROM tbl1 INNER JOIN tbl2 ON tb1.ID=tbl2.FKID
  • @jarlh 检查更新

标签: sql sql-server sql-server-2008


【解决方案1】:

如果您的表实际上由 None 和 NA 组成,那么试试这个:

ALTER PROCEDURE spvec
AS
SELECT Row_number() OVER (ORDER BY (SELECT 1)) AS 'RNumber'
    ,vf.*
FROM LOGIN ld
    ,vehicle vf
WHERE (ld.fid = cast(vf.fid as varchar(max)))
    AND cast(ld.id as varchar(2)) <> 'NA'
    AND cast(vf.CustID as varchar(4)) <> 'None'
    AND cast(vf.Simo as varchar(4)) <> 'None'
ORDER BY Row_number() OVER (ORDER BY (SELECT 1))

【讨论】:

  • 嗨,最重要的信息来得太晚了 :-) 刚刚编辑的 OP ld.fid 是字符串,vf.fid 是 int。所以转换似乎发生在WHERE 的第一部分。顺便说一句:请不要将您的更新通知所有人。
  • this show error Conversion failed when convert the varchar value 'none' to data type int.
  • @user6628729 请说明示例数据以避免为您和其他人带来不必要的工作...没有人可以知道 - 如果没有您的实际表定义和示例数据,哪些值可能会飞由...
  • @user6628729 尝试更新查询。我猜有转换问题等于
  • 然后尝试在查询中添加 distinct
【解决方案2】:

您期望ld.idvf.CustIDvf.Simo 中的哪些值? SQL Server 没有NANone 含义的概念。它只会比较两个值...

如果None 表示NULL(不存在值),您可以使用

WHERE vf.CustID IS NOT NULL

如果您有一个值表明您的 None(例如负数),您可以使用类似

WHERE vf.CustID>=0

在任何情况下,当您想要比较值(排序、连接、过滤器、约束...)时,您都必须了解数据类型

更新

据此

ld.fid 是字符串,vf.fid 是 int 格式

问题(或更好:您的问题之一)在这里:

WHERE (ld.fid = vf.fid)

再次:您期望什么价值观? JOIN(old-fashionedreal)连接具有相同值的行。由于您的vf.fidINT,因此将是纯数字,仅此而已。

无论ld.fid 中的值是什么,只要它是一个普通数字,它就会是相同的。

您没有提及您的 SQL Server 版本。从 2012 年开始,有非常漂亮的 TRY_ 函数。你已经有了一些答案……

您可以尝试使用早期版本:

WHERE (ISNUMERIC(ld.fid) AND CAST(ld.fid AS INT) = vf.fid)

另一种方法是像 VARCHAR 一样进行强制转换

WHERE (ld.fid=CAST(vf.fid AS VARCHAR(100)))

但您必须知道,像100.0100(见空白!)这样的简单格式差异会破坏这种方法。如果可能,请尽量保持类型安全...

不要忘记:您发布的错误消息指向None,而不是连接字段。所以我很确定,你有不止一个类型转换问题......

【讨论】:

  • 行中没有文本和 NA 文本。例如没有空,但有没有值,NA
  • 请显示示例数据...并解释这些数据来自哪里...可能是,NoneNA 只是另一个工具的格式化输出(类似于 @ 987654343@) 在 Excel 单元格中...
【解决方案3】:

首先你必须格式化你的脚本。

将字符串值分配给表中的整数字段时发生错误。很可能是“ld.Id”

2012 年的 SQL 版本.....

 ALTER PROCEDURE spvec
 AS
 BEGIN

   SELECT Row_number()OVER(ORDER BY (SELECT 1))  AS 'RNumber',
            vf.* 
    FROM login ld,
           JOIN vehicle vf  
               ON  TRY_CONVERT(INT, ld.fid) =vf.fid 
     WHERE  ISNULL(ld.id,'') <> 'NA'
           and ISNULL(vf.CustID,'') <> 'None' 
            and vf.Simo <> 'None'  
    Order by Row_number() OVER(ORDER BY (SELECT 1))

END

对于旧版本.....

 ALTER PROCEDURE spvec
 AS
 BEGIN

   SELECT Row_number()OVER(ORDER BY (SELECT 1))  AS 'RNumber',
            vf.* 
    FROM login ld,
           JOIN vehicle vf  
               ON  CONVERT(INT, ld.fid) =CONVERT(INT,vf.fid )
     WHERE  ISNULL(ld.id,'') <> 'NA'
           and ISNULL(vf.CustID,'') <> 'None' 
            and vf.Simo <> 'None'  
            and ISNUMERIC(ld.fid)=1 AND ISNUMERIC(vf.fid)=1
    Order by Row_number() OVER(ORDER BY (SELECT 1))

END

【讨论】:

  • 删除FROM子句FROM login ld,中的逗号
  • 此显示错误.. 将 varchar 值 'CR21' 转换为数据类型 int 时转换失败。
  • 此显示错误“TRY_CONVERT”不是可识别的内置函数名称。 ') 附近的语法不正确
  • @user6628729,请立即说明 SQL Server 的版本。你会为自己和他人避免很多不必要的工作......
  • this show same error Conversion failed when convert the varchar value 'none' to data type int.
猜你喜欢
  • 2011-12-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多