2010-06-30 47 views
3

嘗試在MSSQL 2005以下:int值轉換爲char太小

select convert(char(2), 123) 

這裏的關鍵是,CHAR(2)太小,無法接受值「123」。我希望在這裏看到一個截斷錯誤,但是會返回值「*」。

更新: 一些答案顯示瞭如何投射會導致錯誤的方式。這不是我所需要的。我們有很多代碼使用了一個特定的字段,這個字段曾經被聲明爲char(2),但之後被更改爲int。我的目標是確保沒有被轉換的代碼在遇到無法處理的數據時會崩潰。所以我們可以解決它。

有趣的是,dsolimano指出,將上述類型更改爲nchar會導致預期錯誤,並且Justin Niessner指出這兩者都是有意設計的。奇怪的不一致,因爲nchar是Unicode支持,嘿?

從我在這裏的答案,我似乎無法讓服務器拋出現有代碼的錯誤。

回答

2

微軟convert/cast page似乎表明,你可以投爲nchar(2)如果你想要得到一個錯誤,而不是*或截斷,而事實上這就是我得到:

SELECT CAST(123 AS NCHAR(2)) 

Msg 8115, Level 16, State 2, Line 3 
Arithmetic overflow error converting expression to data type nvarchar. 
+0

在我更改代碼以引發錯誤的情況比僅僅將它固定在第一位更沒有意義。但我真的很喜歡你的答案,因爲它向我展示了爲什麼會發生。 – 2010-06-30 14:40:29

0

在將其轉換爲太小的字符串之前,只需將其轉換爲可變長度的字符串即可。

Select Cast(Cast(123 as varchar(10)) As char(2)) 
0

SQL Server將截斷字符串而不會出現問題。所以,你可以值到varchar先轉換,然後將其轉換爲char(2)

select convert(char(2), cast(123 as varchar(128)) 
1

向下滾動下面的MSDN頁:

CAST and CONVERT (Transact-SQL)

直到你的航向截斷和舍入結果

你會看到你所看到的行爲是定義的行爲。

如果要發生截斷,讓你得到的數量只有兩個數字,那麼你可以嘗試:

select cast(convert(varchar(10), 123) as char(2)) 
0

取決於你的意思是什麼「防止」這種情況的發生?你想要發生什麼?沒有?

DECLARE @number INT 
SET @number = 123 

IF(@number < 100) SELECT CONVERT(char(2), @number)