Добрый день, коллеги!
Нашел интересную особенность, и объяснения ей найти никак не могу. Вроде ничего противоестественного, всё в рамках описанной функциональности. История начинается как обычно — система, пережившая несколько версий SQL сервера, была мигрирована с 2005 Standard редакции на 2012 Enterprise (вер 11.0.5592). В ходе эксплуатации обнаружился запрос, который стал сбоить…
select *
from dbo.Test1 t1
left join dbo.Test2 t2 on t1.Name = t2.IdField
order by t1.SortOrder
Сообщение об ошибке дословно выглядит так
Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to numeric.
Данное поведение наблюдается только в редакции Enterprise. В редакциях Standard и Express аналогичной проблемы не обнаружено.
Примечательно в этом запросе одно – соединение двух таблиц происходит по полям разных типов (varchar(20) и numeric(20, 0)) Ниже я предоставил структуру. Запрос авто генерированный и по всей видимости промахнулись с описанием типов в метаданных. Да, он подвержен неявным преобразованиям, но решение в целом имеет право на существование и работало несколько лет до этого, особенно при условии, что присоединяемая таблица слева dbo.Test2 почти всегда пустая. Скажу сразу, запрос гарантировано работает при любых условиях и на тех же данных где предикаты соединения одинаковых типов (например: varchar(20))
select *
from dbo.Test1 t1
left join dbo.Test2 t2 on t1.Name = t2.StringField
order by t1.SortOrder
| Структура |
| create table dbo.Test1
(
Name varchar(20),
SortOrder varchar(20)
)
create table dbo.Test2
(
IdField numeric(20, 0),
StringField varchar(20)
)
go
|
| |
С ходу повторить ошибку не удалось, поэтому пришлось экспериментировать и вот что выяснилось.
1. Если в таблицу dbo.Test1 вставить 234 символьных записи длиной по 4 байта, то запрос успешно отрабатывает, но без указания сортировки
insert into Test1(Name, SortOrder)
select 'aa', 'bb'
go 234
select *
from dbo.Test1 t1
left join dbo.Test2 t2 on t1.Name = t2.IdField
2. Если в таблицу dbo.Test1 добавить 235 строку длиной 4 байта, то запрос без указания сортировки так же начинает сбоить с той же ошибкой «Error converting data type varchar to numeric»
insert into Test1(Name, SortOrder)
select 'aa', 'bb'
go 235
select *
from dbo.Test1 t1
left join dbo.Test2 t2 on t1.Name = t2.IdField
3. Если в таблицу dbo.Test1 добавить неограниченное количество числовых записей, то все прекрасно работает даже с сортировкой.
insert into Test1(Name, SortOrder)
select '11', '22'
go 1000
select *
from dbo.Test1 t1
left join dbo.Test2 t2 on t1.Name = t2.IdField
order by t1.SortOrder
Пока склоняюсь, что это ошибка производителя, других версий просто нет. Хотя причем здесь преобразование строки к числу, сортировка и какие-то ограничения на объем данных в редакции Enterprise ?!