Sql 将varchar值“1”转换为数据类型int时,转换失败

Sql 将varchar值“1”转换为数据类型int时,转换失败,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,我有一个表类别c和另一个表x,其中有一列可以包含以逗号分隔的cat ID作为varchar数据类型。我想选择相关类别,但将varchar值“5”转换为数据类型int时出错。尝试选择时: SELECT ID, Title FROM c WHERE ID IN (SELECT catIDs FROM x WHERE ID=any); 子查询返回类似于1,3,4的数据。如果我没有弄错,那么实际上列CATID中有类似于1,3,4的值。因此,您应该在子查询的select中提取一个子字符串 顺便说一下,我

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

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

子查询返回类似于1,3,4的数据。如果我没有弄错,那么实际上列CATID中有类似于1,3,4的值。因此,您应该在子查询的select中提取一个子字符串

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

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

在数据库中创建函数dbo.Split,然后按如下方式重新编写查询:

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

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

如果将中的WHERE ID替换为WHERE CASTID as varchar5 IN,会发生什么情况?我同意@Traroth-作为逗号分隔值字符串返回的ID列表表明数据库设计存在问题。x表中是否确实存在CATID列?或者这只是一个示例,1,3,4实际上是从存储的rpocedure返回的,或者是从平面文件检索的?@Carnotaurus:它正在工作,但没有返回正确的结果,因为它正在查找“x,y”,而不是“x”,“y”Nice one@Carnotaurus,而不是将选择的结果转换为int,将ID值转换为varchar。就像一个符咒。是的,我要使用函数。非常感谢。