【问题标题】:Why does SQL Server conversion to bigint cause an error?为什么 SQL Server 转换为 bigint 会导致错误?
【发布时间】:2012-11-29 20:45:13
【问题描述】:

我正在尝试将varchar 转换为bigint

select convert(bigint, (select(Replace((select value from sometable), ' ', ''))))

为什么会报错???

将数据类型 varchar 转换为 bigint 时出错。

提前致谢

更新

这是我正在尝试的查询的一部分:

select top 1 * 
into #tblTemp 
from testTable 
where Status = 0 
order by Sno

declare @mobile varchar(50)

set @mobile = (select(Replace((select mobile from #tblTemp), ' ', '')))

--set @mobile = (select( Replace(' 9428017524', ' ', '')))

select convert(bigint, @mobile)

drop table #tblTemp

【问题讨论】:

  • 你遇到了什么错误??
  • 它实际上对我有用,我看不到明显的问题。这是您真正的查询还是您刚刚粘贴了您期望来自另一个查询或变量的值?
  • 您确定数字前有空格而不是制表符之类的其他符号吗?要删除空格,您可以使用 ltrimrtrim,顺便说一句
  • 一个典型的错误是当你有一个where 子句“应该”在select 子句中过滤掉所有非数字值和这样的转换。不幸的是,SQL Server 有时会在过滤步骤发生之前进行SELECT 子句转换。

标签: sql sql-server type-conversion


【解决方案1】:

试试这个

select convert(bigint, CASE WHEN ISNUMERIC(@mobile + 'e0') = 0 
                THEN 0 ELSE @mobile)

 -- add this case statement to return only numeric values,     
 -- your query will fail for values like '123-415-6789', '(123)415-6789'

检查您的手机号码数据,看看该列中是否有任何意外值,您可能需要将'-''('')' 等替换为''

SeLECT * FROM #tblTmp
WHERE ISNUMERIC(Replace(mobile, ' ', '') + 'e0') = 0;

【讨论】:

  • 当然,ISNUMERIC 将为 1d2£ 返回 1,因为它回答的问题与您在此处实际想问的问题不同。
  • @Damien_The_Unbeliever,我更新了我的答案以正确测试数字数据。
【解决方案2】:

我不确定您的真实字符串是什么,但为了安全起见,您可以在转换前检查ISNUMERIC()

DECLARE @mobile varchar(50)
SELECT @mobile = REPLACE(mobile, ' ','') --much simplified version
FROM #tblTemp 

IF ISNUMERIC(@mobile)
   SELECT CONVERT(bigint, @mobile)
ELSE
   SELECT 0

只需阅读您的查询,you don't need a temp table 就在这里。一切都可以在一个查询中完成

SELECT TOP (1) CONVERT(bigint,  CASE ISNUMERIC( REPLACE(mobile,' ','') ) 
                                   WHEN 1 THEN REPLACE(mobile,' ','')
                                   ELSE 0 END )
FROM testTable 
WHERE Status = 0 
ORDER By Sno

【讨论】:

  • 当然,ISNUMERIC 将为1d2£ 返回 1,因为它回答的问题与您在此处实际想问的问题不同。
  • @Damien_The_Unbeliever 还有更多'1E2'。这就是为什么我说not sure what your real string is。另一方面,它看起来像一个手机号码,因此我们可以假设它是一个仅限数字的字段(也可能是 +)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多