【问题标题】:Conversion failed when converting the varchar value '1,' to data type int将 varchar 值“1”转换为数据类型 int 时转换失败
【发布时间】:2010-11-27 09:34:55
【问题描述】:

我有表类别 (c) 和另一个表 (x),其中的一列可以包含用逗号分隔的猫 ID 作为 varchar 数据类型。我想选择相关类别,但出现错误“将 varchar 值 '5' 转换为数据类型 int 时转换失败。”尝试选择时:

SELECT ID, Title FROM c WHERE ID IN (SELECT catIDs FROM x WHERE ID=any);

子查询返回类似“1,3,4”的数据

【问题讨论】:

  • 如果将 WHERE ID IN 替换为 WHERE CAST(ID as varchar(5)) IN 会发生什么?
  • 我同意@Traroth - 作为逗号分隔值字符串返回的 ID 列表表明数据库设计存在问题x 表中真的有catIDs 列吗?或者这只是一个示例,1,3,4 实际上是从存储的 rpocedure 返回或从平面文件中检索的?
  • @Carnotaurus:它正在工作但没有返回正确的结果,因为它正在寻找'x,y',而不是'x','y'
  • 不错的@Carnotaurus,而不是将您的选择结果转换为int,而是将ID值转换为varchar。像魅力一样工作。

标签: sql sql-server sql-server-2005 tsql


【解决方案1】:

您需要将子查询返回的1,3,4 字符串拆分为单独的int 值。 SQL Server 没有内置函数来执行此操作,但您可以使用this user-defined function

在您的数据库中创建函数dbo.Split,然后重新编写您的查询,如下所示:

SELECT ID, Title
FROM c
WHERE ID IN
  (
    SELECT s
    FROM dbo.Split(',', '1,3,4')
  )

我将子查询替换为示例结果1,3,4,以缩短查询并使其更易于理解。

【讨论】:

【解决方案2】:

如果我没看错,您的 catID 列中实际上有“1,3,4”之类的值。因此,您应该在子查询的选择中提取一个子字符串。

顺便说一句,我不是 MS SQL Server 专家,但这样做可能是一个糟糕的数据库设计。我不确定 RDBMS 引擎会在这种情况下使用索引...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多