2011-06-07 39 views
2

首先,感謝您的全力幫助!你真的有所作爲,我非常感謝。使用SQL 2005試圖將16位Varchar轉換爲Bigint錯誤轉換

所以我有一個VARCHAR列和它擁有一個16位數字,例如:1000550152872026

select * 
FROM Orders 
where isnumeric([ord_no]) = 0 

返回:0行


select cast([ord_no] as bigint) 
FROM Progression_PreCall_Orders o 
order by [ord_no] 

回報:將數據類型varchar轉換爲bigint時出錯。

如何將此16位數字轉換爲數學數據類型,以便我可以從中增加或減去另一列?

UPDATE:找到科學記數法存儲爲varchar例如:1.00054E + 15

如何轉換回成數呢?

+3

這個查詢是否返回任何內容:'SELECT * FROM Orders WHERE ord_no LIKE'%[^ 0-9]%''? – 2011-06-07 04:47:34

+0

@Andriy M哇! 3k行! – CodingIsAwesome 2011-06-07 05:07:52

回答

2

decimal數據類型似乎很好地工作:

DECLARE @myVarchar AS VARCHAR(32) 
SET @myVarchar = '1000550152872026' 

DECLARE @myDecimal AS DECIMAL(38,0) 
SET @myDecimal = CAST(@myVarchar AS DECIMAL(38,0)) 
SELECT @myDecimal + 1 

而且,這裏有一個簡單的例子,其中IsNumeric回報1但轉換爲十進制失敗:

DECLARE @myVarchar AS VARCHAR(32) 
SET @myVarchar = '1000550152872026E10' 
SELECT ISNUMERIC(@myVarchar) 

DECLARE @myDecimal AS DECIMAL(38,0) 
SET @myDecimal = CAST(@myVarchar AS DECIMAL(38,0)) --This statement will fail 

編輯
你可以嘗試CONVERT浮動如果你正在處理用科學計數法寫的值:

DECLARE @Orders AS TABLE(OrderNum NVARCHAR(64), [Date] DATETIME) 
INSERT INTO @Orders VALUES('100055015287202', GETDATE()) 
INSERT INTO @Orders VALUES('100055015287203', GETDATE()) 
INSERT INTO @Orders VALUES('1.00055015287E+15', GETDATE()) --sci notation 

SELECT 
    CONVERT(FLOAT, OrderNum, 2) + 
    CAST(REPLACE(CONVERT(VARCHAR(10), GETDATE(), 120), '-', '') AS FLOAT) 
FROM @Orders 
+0

錯誤轉換數據類型爲varchar到數字::是我得到:( – CodingIsAwesome 2011-06-07 04:48:22

+0

@CodingIsAwesome更新我的回答表明,你可以數從你的問題轉換爲十進制。這則IsNumeric可以返回1,問題可能與事實你可能沒有想到的結果,你能找到你的查詢失敗的行嗎? – rsbarro 2011-06-07 04:56:13

+0

我似乎無法做到,我已經嘗試了幾件事情,我確信數字總是以16位數字形式存儲在varchar中。 – CodingIsAwesome 2011-06-07 05:01:05

2
WITH validOrds AS 
(
    SELECT ord_no 
    FROM Orders 
    WHERE ord_no NOT LIKE '%[^0-9]%' 
) 
SELECT cast(validOrds.ord_no as bigint) as ord_no 
FROM validOrds 
     LEFT JOIN Orders ords 
      ON ords.ord_no = validOrds.ord_no 
WHERE ords.ord_no is null    

看看這個鏈接爲什麼ISNUMERIC沒有發揮作用假定你是會的方式的解釋:http://www.sqlservercentral.com/articles/IsNumeric/71512/

在這個鏈接的看看SO張貼一個地方用戶也有類似的問題,因爲你: Error converting data type varchar

因此,你應該總是用正確的數據類型的每一列,除非你有一個非常特殊的理由這樣做,否則......即使這樣,你就需要格外將值保存到列時要小心它確實是有效的值

+0

哇,我從來沒有想過我必須把它分解成什麼是數字()= 1!我的上帝,我怎麼解釋說我不知道​​我的老闆會看起來有什麼看似自我解釋的功能。 – CodingIsAwesome 2011-06-07 05:16:30

+0

@CodingIsAwesome沒有人知道該功能是如何工作的,直到遇到像這樣的問題... =) – rsbarro 2011-06-07 05:18:06

+0

@rsbarro,然後將該鏈接保存在您的收藏夾中:D – clyc 2011-06-07 05:22:30

相關問題