Я хотел бы знать, что может быть причиной непоследовательного способа, которым сервер sql обрабатывает переполнение типа. И как правильно предотвратить тихое повреждение данных, которое вызывает у нас SQL Server.
Хорошо себя int
Например, int дает правильное исключение переполнения.
declare @b int = 123456789000
Msg 8115, Level 16, State 2, Line 3 Arithmetic overflow error converting expression to data type int.
Безмолвный bit
Битовое значение будет равно нулю для нуля и единице для всего остального, что вы пытаетесь вставить (с небольшим дополнительным развлечением на пустой строке).
declare @a bit = 123
, @b bit = ''
select a = @a, b = @b
выход:
a b ----- ----- 1 0
create table #bit_type(a bit)
insert into #bit_type values (123), ('')
select * from #bit_type
выход:
a - 1 0
declare @bit_type table (a bit)
insert into @bit_type values (123), ('')
select * from @bit_type
выход:
a - 1 0
Такое поведение часто является причиной очень проблем с отладкой ETL (недопустимое значение во входном файле автоматически преобразуется в 1 или ноль)
Шизофреник varchar
Varchar (и char
/nchar
/nvarchar
) — еще один раздражающий тип данных.
declare @c varchar(5)
select @c = '123456789'
print @c
Результат молча усекается.
12345
create table #varchar_type(a varchar(5))
insert into #varchar_type values ('123456789')
Здесь мы получаем правильную ошибку переполнения.
Сообщение 8152, уровень 16, состояние 14, строка 1 Строка или двоичные данные будут усечены. Заявление было прекращено.
declare @varchar_type table(a varchar(5))
insert into @varchar_type values ('123456789')
Здесь мы также получаем правильную ошибку переполнения.
Сообщение 8152, уровень 16, состояние 14, строка 2 Строковые или двоичные данные будут усечены. Заявление было прекращено.