在非常特殊的情况下将varchar转换为bigint时出错

时间:2014-08-19 20:41:46

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

我的目的是检索转换为BigInt的所有CLIENT_CODE,以便与400行sql查询中where子句中作为参数传递的值进行比较。执行下面的代码时,我收到以下错误消息:

  来自sql server的

消息错误8114:“将varchar转换为的错误   BIGINT”。

测试代码:

select CASE when (len (CLIENT_CODE) > 2 and isNumeric(CLIENT_CODE) = 1)
        then (CAST(SUBSTRING(TAB.CLIENT_CODE, 1, LEN(TAB.CLIENT_CODE)-1) AS BIGINT)) 
        else CLIENT_CODE end from TABLE TAB

代码嵌套:

--HUGE_SQL... 
AND ((CASE when (len (CLIENT_CODE) > 2 and isNumeric(CLIENT_CODE) = 1)
        then (CAST(SUBSTRING(TAB.CLIENT_CODE, 1, LEN(TAB.CLIENT_CODE)-1) AS BIGINT)) 
        else CLIENT_CODE end) = @MyClient_Code) 
--... HUGE_SQL

我们的CLIENT_CODEvarchar(20),有些有0个字符,有些有字母,但几乎每个记录都是数字。

根据我的理解,必须首先评估案例,但似乎并非如此。

当我将isNumeric(CLIENT_CODE) = 1放在where子句中时,在测试代码中,它可以工作。我的问题是我不能在这种特殊情况下这样做,因为事实上它已经嵌套在一个巨大的SQL查询的where子句中,并且添加isNumeric(CLIENT_CODE) = 1不起作用,因为它有一个很多其他条件。

检索此数据的最佳方法是哪种?有人能弄清楚怎么做吗? (对于如何处理函数vs case vs where where

,这将是非常有用的解释。)

1 个答案:

答案 0 :(得分:2)

您的Case表达式在一种情况下返回BIGINT,否则返回VARCHAR数据类型。

对于Case表达式,在每种情况下返回的数据类型必须相同。

而不是使用ISNUMERIC()使用以下

select CASE 
          when (len (CLIENT_CODE) > 2 and CLIENT_CODE NOT LIKE '%[^0-9]%')
          then (CAST(SUBSTRING(TAB.CLIENT_CODE, 1, LEN(TAB.CLIENT_CODE)-1) AS BIGINT)) 
       end 
from TABLE TAB
对于像ISNUMERIC()123a1这样的值,

346g2会返回true,它认为它是对功能提升的值,因此使用NOT LIKE '%[^0-9]%'来获取仅存在实际数值的字符串。