2017-06-05 485 views
1

我想將nvarchar數據轉換爲float類型。SQL:將數據類型nvarchar轉換爲浮點時出錯

在我來說,我有SalesValue列,我用這個命令

UPDATE Overseas 
SET SalesValue = CONVERT(FLOAT, REPLACE([SalesValue],',','')) 

我的表中有值,像

201.01 
40.50 
215.12 
550 
304.201 

但我得到一個錯誤

SQL:錯誤轉換數據類型nvarchar浮動。

我該如何解決這個問題?

+1

1日投值這些錢數額?不建議使用FLOAT開始。使用DECIMAL或MONEY。問題不在於你給出的十進制值作爲例子。這將與無法轉換爲小數的值(如美元符號$)一起使用。 –

+0

這些值都可以轉換爲float數據類型。 SELECT CAST( '201.01' AS FLOAT) SELECT CAST('40 0.50' AS FLOAT) SELECT CAST( '215.12' AS FLOAT) SELECT CAST( '550' AS FLOAT) SELECT CAST( '304.201' AS FLOAT) – Tarzan

+0

還有其他事情嗎? – Tarzan

回答

1

使用下面的查詢,然後更新正常

SELECT 
      case when ISNUMERIC([SalesValue])=1 
      then CAST([SalesValue] AS FLOAT) else 0 end AS CastedValue) 
     FROM your_table_name 
+0

嘗試您的代碼,其中'SalesValue ='$''或'SalesValue ='1e4'' 。你的方法是有缺陷的,你會從閱讀[這篇文章](https://stackoverflow.com/a/7400335/6167855)中受益,它是底層引用。 – scsimon

+0

@scsimon可以用編輯後的代碼發佈你的答案 – 3mr

1

您應該找到不匹配的值。在SQL Server 2012+中,您可以使用try_convert()。這是不可用的。那麼,這個怎麼樣?

SELECT SalesValue 
FROM Overseas 
WHERE SalesValue LIKE '%[^0-9,.]%' OR 
     SalesValue LIKE '%[.,]%[.,]%'; 

我認爲這涵蓋了明顯的不規則性:一個不是數字或兩個(或多個)小數點的字符。

+0

你能寫出完整的命令嗎? – 3mr

+0

@ 3mr。 。 。您必須運行查詢來找出錯誤的值。然後相應地處理它們。 –

+0

我做你說的,但我加載我的數據通常和動態從Excel文件..現在需要什麼手動壞值在哪裏? – 3mr

0

這聽起來對我來說你的數據仍然有一些非數值的東西。我希望你的應用程序在輸入數據前清理你的數據做得非常好,而且問題可能是你在一個或多個字段中有'$'。 如果您有非數字字符,則演員將失敗。在其中(因爲你可能知道這是你刪除'''的原因)。 我跑下面的腳本來測試這個。

declare @myFloat float; 
declare @test1 nvarchar(10) = '145.88'; 
declare @test2 nvarchar(10) = '4,145.88'; 
declare @test3 nvarchar(10) = '$4,145.88'; 

SELECT ISNUMERIC(@TEST3) 
set @myFloat = CONVERT(FLOAT, REPLACE(@test1,',','')); 
select @myFloat; 

set @myFloat = CONVERT(FLOAT, REPLACE(@test2,',','')); 
select @myFloat; 

--THIS WILL FAIL 
set @myFloat = CONVERT(FLOAT, REPLACE(@test3,',','')); 
select @myFloat; 
--THIS WILL NOT FAIL 
set @myFloat = CONVERT(FLOAT, REPLACE(REPLACE(@test3,',',''),'$','')); 
select @myFloat; 

你可以嘗試運行有問題的列下面的腳本,看看您有一個問題,列:

--run this on your table 
SELECT SalesValue 
FROM Overseas 
WHERE ISNUMERIC(REPLACE(SalesValue,',','')) = 0 

--test sample 
/* 
insert into #myTable 
values ('145.88'), 
     ('4,145.88'), 
     ('$4,145.88'), 
     ('$4,145.88%'); 

SELECT * 
FROM #myTable 
WHERE ISNUMERIC(REPLACE(amounts,',','')) = 0 
--WHERE ISNUMERIC(REPLACE(REPLACE(amounts,',',''),'$','')) = 0 --this will remove results with $ also 
*/ 

所以你弄不好會是簡單地改變你所提供的線:

UPDATE Overseas SET SalesValue = CONVERT(FLOAT, REPLACE(REPLACE([SalesValue],',',''),'$','')) 

除非您在前面的腳本結果中找到其他字符。

+0

我沒有$登錄我的值,因爲我說..我從Excel表中獲得了我的數據,我認爲這是問題.. – 3mr

+0

用科學記數法檢查您的代碼...即''1e4''作爲@test – scsimon

+0

我同意scsimon。 Excel試圖通過基於列數據的採樣來確定數據類型來「幫助」。在我的工作中,我有一個查看excel文檔中單元格的SSIS包。我在測試中發現,當工作簿沒有被預格式化爲所有單元格的「文本」時,或者如果從另一個源複製並粘貼(編碼問題),我的包將無法正確讀取數據。 @ 3mr todo:獲取空白工作簿,全選,將單元格格式化爲文本,粘貼數據並重試。 – chris

0

這將讓你更接近比ISNUMERIC()

declare @table table (SalesValue varchar(16)) 
insert into @table 
values 
('1e4'), 
('$'), 
('134.55'), 
('66,9897'), 
('14') 

select 
    SalesValue 
    ,case 
     when SalesValue NOT LIKE '%[^0-9,.]%' 
     then convert(decimal(16,4),replace(SalesValue,',','.')) 
    end 
from 
    @table 
相關問題