在SQL Server中将列值转换为int

时间:2013-05-10 09:40:14

标签: sql sql-server casting

我正在处理此查询并且返回异常无法将varchar转换为int

 SELECT BG_PRIORITY, count(*) as cnt 
 FROM Bug 
 WHERE BG_TARGET_REL= case when ISNUMERIC('XXXX 13.5') = 1 then 
 cast('XXXX 13.5' as int) else 'XXXX 13.5' end 
 GROUP BY BG_PRIORITY   

此查询是从我的C#代码生成的。 Where子句过滤器可以是数字或字符串过滤器,因为用户选择他/她想要的过滤器类型并根据其值给出。

是否有方法可以在查询中添加任何类型的过滤器?

1 个答案:

答案 0 :(得分:4)

IF 您的唯一列类型是intvarchar,那么您只需使用它:

SELECT BG_PRIORITY, count(*) as cnt 
FROM Bug 
WHERE <ChosenColumn> = 'InputValue'
GROUP BY BG_PRIORITY;

这可以通过使用SQL Server的隐式data type precedence转换来实现。如果是int,则输入值(如'123')将转换为数字123(正是我们想要的那样!)。如果列是varchar,则引用的值仍为varchar。


您的原始CAST错误源于CASE语句导致一种数​​据类型和一种数据类型,使用上面链接的相同数据类型优先级规则。考虑你的分支机构:

case when ISNUMERIC('XXXX 13.5') = 1
     then cast('XXXX 13.5' as int)      --<< this branch returns int
     else 'XXXX 13.5'                   --<< this branch returns varchar
     end
       >> data type precedence ==>  resultant type of expression is "int"

当你给它一个值'XXXX 13.5'时,case语句会产生'XXXX 13.5',然后它需要转换为CASE expression resultant type,即int =&gt;失败。