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

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

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

message error 8114 from sql server: "Error converting varchar to 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 并没有行不通,因为它还有很多其他条件。

检索此数据的最佳方式是什么?有人能弄清楚该怎么做吗? (对如何处理函数、案例和位置的某种解释将非常有帮助)

最佳答案

您的 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() 对于 123a1346g2 等值返回 true,它认为它是加幂的东西,因此使用 NOT LIKE '%[^0-9]%' 获取仅存在实际数值的字符串。

关于sql-server - 在非常特殊的情况下将 varchar 转换为 bigint 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25392602/

相关文章:

java - 使用客户端凭据从 Tomcat 连接到 SQL Server

sql-server - SQL 服务器登录和用户

tsql - 为什么原子语句需要锁提示?

sql-server - SQL 查询 - COUNT 用于单个表中两列或更多列的组合

sql-server - 尽管有有效的统计数据,但查询计划估计的行数低得​​离谱

javascript - 如何从 C# 生成的 html 输入中获取多个值

sql-server - 如何在 SQL SERVER 中选择最后一个不同的记录

sql - 按两列分组并在每行中显示总计

sql - 日期和小时的 Datediff(24 小时)

sql - JOIN 的 ON 子句中引用的表的顺序是否重要?