Sql 将int值转换为太小的字符

Sql 将int值转换为太小的字符,sql,sql-server,truncation,Sql,Sql Server,Truncation,在MSSQL 2005上尝试以下操作: select convert(char(2), 123) 这里的关键是char(2)太小,无法接受值“123”。我希望在这里看到截断错误,但是返回值“*” 更新: 一些答案显示了如何以一种会导致错误的方式进行转换。那不是我真正需要的。我们有很多代码使用了一个特定的字段,该字段过去被声明为char(2),但后来被更改为int。我的目标是确保未转换的代码在遇到无法处理的数据时会崩溃。所以我们可以去修理它 有趣的是,注意将上述类型更改为nchar会导致预期的错

在MSSQL 2005上尝试以下操作:

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

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

有趣的是,注意将上述类型更改为nchar会导致预期的错误,并且注意到这两种类型都是经过设计的。奇怪的是,nchar支持Unicode,嘿


从我这里得到的答案来看,很遗憾,我无法让服务器为现有代码抛出错误

只需将其转换为可变长度字符串,然后再转换为太小的字符串

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

SQL Server将毫无问题地截断字符串。因此,您可以先将该值转换为
varchar
,然后将其强制转换为
char(2)


向下滚动以下MSDN页面:

直到得到标题截断和舍入结果

您将看到您看到的行为是定义的行为

如果要进行截断,以便只得到数字的两位数,则可以尝试:

select cast(convert(varchar(10), 123) as char(2))
这取决于你所说的“阻止”这件事发生是什么意思?你希望发生什么?什么都没有

DECLARE @number INT
SET @number = 123

IF(@number < 100) SELECT CONVERT(char(2), @number)
DECLARE@number INT
设置@number=123
如果(@number<100)选择转换(字符(2),@number)
微软似乎指出,如果您希望获得错误而不是
*
或截断,您可以强制转换到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.

在我的例子中,将代码更改为抛出错误比一开始就修复错误更有意义。但我真的很喜欢你的回答,因为它告诉了我为什么会这样。
SELECT CAST(123 AS NCHAR(2))

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