将int值转换为太小的char

时间:2010-06-30 13:34:50

标签: sql sql-server truncation

在MSSQL 2005上尝试以下操作:

select convert(char(2), 123)

这里的关键是char(2)太小而不能接受值'123'。我希望在这里看到截断错误,但返回值“*”。

更新 一些答案显示了如何以导致错误的方式进行投射。这不是我真正需要的。我们有很多代码使用特定字段,该字段曾经被声明为char(2)但后来被更改为int。我的目标是确保未遇到转换的代码遇到无法处理的数据时会丢失。所以我们可以解决它。

有趣的是,dsolimano注意到将上述类型更改为nchar会导致预期的错误,并且Justin Niessner注意到这两者都是设计的。鉴于nchar是支持Unicode的,奇怪的不一致,嘿?

从我在这里的答案看来,我遗憾地无法让服务器抛出现有代码的错误。

5 个答案:

答案 0 :(得分: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.

答案 1 :(得分:1)

向下滚动以下MSDN页面:

CAST and CONVERT (Transact-SQL)

直到您到达标题截断和舍入结果

您会看到您所看到的行为是已定义的行为。

如果您希望截断发生以便只获得该数字的两位数,那么您可以尝试:

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

答案 2 :(得分:0)

在将其转换为太小的字符串之前,将其强制转换为可变长度字符串。

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

答案 3 :(得分:0)

SQL Server将截断字符串没有问题。因此,您可以先将值转换为varchar,然后将其转换为char(2)

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

答案 4 :(得分:0)

取决于“阻止”这种情况发生的意思?你想要发生什么?什么?

DECLARE @number INT
SET @number = 123

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