2012-12-12 45 views
1

我想轉換varcharbigint爲什麼SQL Server轉換爲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 
+0

你有什麼錯誤? –

+2

[**我認爲它工作正常。**](http://www.sqlfiddle.com/#!3/d41d8/7020) –

+1

它實際上適用於我,我看不到明顯的問題。這是你真正的查詢還是你剛剛粘貼了你期望的來自另一個查詢或變量的值? – PeterJ

回答

1

我不確定你真正的字符串是什麼,但爲了安全起見,你可以在轉換前檢查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 
+0

當然,'ISNUMERIC'將返回1作爲'1d2'或''',因爲它回答了一個你真正想問的問題。 –

+0

@Damien_The_Unbeliever還有一些「1E2」。這就是爲什麼我說'不確定你真正的字符串是什麼'。另一方面,它看起來像一個手機號碼,所以我們可以假設它只是一個數字字段(也可以是+)。 – Kaf

2

試試這個

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; 
+0

當然,'ISNUMERIC'將爲'1d2'或'£'返回1,因爲它回答了一個與您實際想在此問的問題不同的問題。 –

+0

@Damien_The_Unbeliever,我更新了我的答案,正確測試數字數據。 –

相關問題