我有使用过程将数据插入表以固定列大小。但是数据修剪并成功插入,没有任何错误。
我从该变量中丢失了一些内容。
此代码段未显示任何错误:
declare @temp varchar(5)
declare @tm table (a varchar(5))
set @temp ='abcdefghijkl'
insert into @tm
values(@temp)
select * from @tm
但是此代码段正在显示此错误:
字符串或二进制数据将被截断
declare @temp1 varchar(5)
declare @tm1 table (a varchar(5))
insert into @tm1
values('abcdefghijkl')
select * from @tm1
答案 0 :(得分:1)
第二个代码段引发错误的事实是一件好事。
它可以防止您错误地破坏数据。
但是,在第一个代码段中,由于隐式转换规则,SQL Server将以静默方式修剪字符串。
每当您尝试使用具有不同数据类型的数据填充变量时,SQL Server都会尝试将数据类型隐式转换为变量的数据类型。
在char和varchar(Transact-SQL)页面的Converting Character Data部分中对此进行了详细记录:
将字符表达式转换为不同大小的字符数据类型时,对于新数据类型而言太长的值将被截断。
如果将ANSI_WARNINGS
设置为ON
(默认状态),则在插入表中时不会发生这种情况。
将ANSI_WARNINGS
设置为ON
时,您将获得
字符串或二进制数据将被截断
错误消息。
但是,当将其设置为OFF
时,隐式转换将自动截断数据:
set ansi_warnings off;
declare @temp1 varchar(5)
declare @tm1 table (a varchar(5))
insert into @tm1
values('abcdefghijkl')
select * from @tm1
结果:
a
abcde
注意::ansi_warnings
状态在设置变量值时不起作用,隐式转换-无论ansi_warnings
状态如何,它都会被截断。