2011-02-03 151 views
21

我需要從數據類型float的一列中進行選擇,並將其作爲nvarchar插入到另一列中。將浮點數轉換或轉換爲nvarchar?

我試着投它:cast([Column_Name] as nvarchar(50))

結果是9.07235e+009,而不是一個10位數字(電話號碼)。

是否有人知道如何正確投射或轉換這些數據?

+6

即使電話號碼是一種「數字」,一般的經驗法則是,如果您計劃與他們進行某種計算,只能將數字存儲爲數字。如果您打算存儲的數字永遠不需要任何操作(除了更新或者這些行的某個內容之外),您應該將它們存儲爲某種類型的字符串。 – syllogism 2011-02-03 00:59:52

回答

14

如果您將電話號碼存儲在浮動類型的列中(這是一個壞主意),那麼它們大概都是整數,並且可以在投射到nvarchar之前轉換爲int。

所以不是:

select cast(cast(1234567890 as float) as nvarchar(50)) 
1.23457e+009 

你可以使用:

select cast(cast(cast(1234567890 as float) as int) as nvarchar(50)) 
1234567890 

在這些例子中,最裏面的cast(1234567890 as float)到位,從相應的列中選擇一個值的使用。

我真的建議,你不存儲電話號碼在花車雖然!
如果電話號碼以零開頭會怎麼樣?

select cast(0100884555 as float) 
100884555 

哎呀!我們剛存儲了一個不正確的電話號碼...

+0

算術溢出 – RichardTheKiwi 2011-02-03 02:01:22

+0

確實如此,但如果您的手機號碼超過40億,您可以隨時使用bigint。無論如何,STR函數看起來像是一個更好的選項,在這個問題之前我不知道! – Coxy 2011-02-03 02:18:36

30

檢查STR。您需要類似SELECT STR([Column_Name],10,0) **這是SQL Server解決方案,用於其他服務器檢查其文檔。

7

不要使用浮點數存儲定點,準確性要求的數據。 此示例顯示如何正確地將float轉換爲NVARCHAR(50),同時還說明了爲精度數據使用浮點數是不好主意。

create table #f ([Column_Name] float) 
insert #f select 9072351234 
insert #f select 907235123400000000000 

select 
    cast([Column_Name] as nvarchar(50)), 
    --cast([Column_Name] as int), Arithmetic overflow 
    --cast([Column_Name] as bigint), Arithmetic overflow 
    CAST(LTRIM(STR([Column_Name],50)) AS NVARCHAR(50)) 
from #f 

輸出

9.07235e+009 9072351234 
9.07235e+020 907235123400000010000 

您可能注意到,第二輸出與「10000」結束,即使我們試圖在表中存儲數據與「00000」結束。這是因爲float數據類型具有固定數量的有效數字支持,這並沒有延伸到那麼遠。

-1

DECLARE @MyFloat [浮子]

SET @MyFloat = 1000109360.050

SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM((REPLACE(CAST(CAST(@MyFloat爲十進制(38,18) )AS VARCHAR(max)),'0',''))),'','0'),'。','')),'','。')