2

我正在处理这个查询,它返回的异常不能转换varcharint

 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 子句过滤器可以是数字或字符串,因为用户可以选择他/她想要的过滤器类型并据此给出其值。

有没有一种方法可以让我在查询中添加任何类型的过滤器?

4

1 回答 1

4

如果您唯一的列类型是intand varchar,那么您可以简单地使用它:

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

这通过使用 SQL Server 的隐式数据类型优先级转换来工作。如果是一个 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 => 失败。

于 2013-05-10T10:01:39.790 回答