2010-04-06 59 views
3

我有一個VARCHAR(255)類型的列的SQL Server 2000數據庫。所有的數據都是NULL,或者是數字數據,最多有兩個精度點(例如'11.85')。我試圖運行下面的T-SQL查詢,但收到的錯誤「錯誤轉換數據類型爲varchar到數字」問題將列值從VARCHAR(n)轉換爲DECIMAL

SELECT CAST([MyColumn] AS DECIMAL) 
FROM [MyTable]; 

我想更具體的演員陣容,這也失敗了。

SELECT CAST([MyColumn] AS DECIMAL(6,2)) 
FROM [MyTable]; 

我也嘗試了以下看看是否有任何數據是非數字的,並且返回的唯一值是NULL。

SELECT ISNUMERIC([MyColumn]), [MyColumn] 
FROM [MyTable] 
WHERE ISNUMERIC([MyColumn]) = 0; 

我試圖轉換爲其他數據類型,如FLOAT和MONEY,但只有MONEY是成功的。所以我嘗試了以下內容:

SELECT CAST(CAST([MyColumn] AS MONEY) AS DECIMAL) 
FROM [MyTable]; 

...哪些工作得很好。任何想法爲什麼原始查詢失敗?如果我先轉換爲MONEY然後轉換爲DECIMAL,會不會有問題?

謝謝!

回答

16

這很可能取決於小數點符號是逗號還是點。下面是一些測試查詢及其結果:

select CAST('3.6' as decimal) -- 3.60 
select CAST('3,6' as decimal) -- Error converting data type varchar to numeric. 
select CAST('3.6' as money) -- 3.60 
select CAST('3,6' as money) -- 36.00 (!) 
select ISNUMERIC('3.6') -- 1 
select ISNUMERIC('3,6') -- 1 

ISNUMERIC文檔說:

ISNUMERIC返回1,當輸入 表達式的計算結果爲有效 整數,浮點數,貨幣 或十進制類型;否則返回0

兩個3.63,6可以轉換爲money,所以這就是爲什麼isnumeric('3,6')回報1

要解決此問題,用點代替逗號(或反之,如果你的系統使用逗號作爲小數點符號):

select cast(replace('3,6',',','.') as decimal) 

另一種方法是在Windows中更改「小數點符號」。它在配置面板 - >區域和語言 - >格式 - >其他設置 - >數字。

+0

這是與導致問題的逗號而不是小數點幾個記錄。謝謝你的偉大答案! – 2010-04-07 00:18:40

0

選擇CAST(isnull(MyColumn,0)as Decimal(4,2)) FROM [MyTable];

3

另一個原因是空字符串。例如,如果您使用導入嚮導導入CSV文件,則空字段將變成空字符串,而不是空值。

這是解決這個常見的成語:

CAST(NULLIF([number_as_a_string],'') AS decimal(13,2)) 
相關問題