Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 поясните плз почему такая фигня  [new]
ther
Member

Откуда:
Сообщений: 839
в общем неудобно спрашивать начальство ибо вроде элементарно все но
есть запрос
select el.id,el.Title from Spr_Element el
join Spr_Models mo on mo.ID=el.ModelID and mo.[Type]=4
который дает результат
id Title
3355 16
3356 32
3357 64
3358 128
3359 256
3360 512
3361 1024
3362 2048
3363 4096
3364 8192

но если его переписать как
select el.id,cast(el.Title as int) Title from Spr_Element el
join Spr_Models mo on mo.ID=el.ModelID and mo.[Type]=4
то выдает
Ошибка преобразования значения varchar "Cool PC" в тип данных int.

"Cool PC" данные из таблицы Spr_Element но его тип в таблице Spr_Models=3

в чем прикол?
16 авг 11, 14:42    [11126643]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
mo.ID
el.ModelID
mo.[Type]

какого типа?
16 авг 11, 14:43    [11126652]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
ther, а вы уверены что влазит в int? Может у вас там что-то типа '12243254325436543254354325435432543543' записано))).
16 авг 11, 14:45    [11126659]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7498
ther
cast(el.Title as int)
16 авг 11, 14:47    [11126679]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31961
ther
в чем прикол?
Вот такой план выполнения получился, сначала выбирает, потом фильтрует.

Можно поменять план, но тогда может получится медленно.

Или можно вычислять перед cast-ом:
cast(case when el.Title like '%[^0-9]%' then null else el.Title end as int)
16 авг 11, 14:48    [11126685]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31961
Гавриленко Сергей Алексеевич
mo.ID
el.ModelID
mo.[Type]

какого типа?
Да, остальные типы тоже надо посмотреть, хотя ошибка наверняка в преобразовании el.Title
16 авг 11, 14:49    [11126689]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
ther
Member

Откуда:
Сообщений: 839
Гавриленко Сергей Алексеевич
mo.ID int IDENTITY(1, 1) NOT NULL
el.ModelID int NULL
mo.[Type] int NOT NULL


kDnZP
все данные поля el.title приведены в результате...там как вы видите нет '12243254325436543254354325435432543543'

сразу хочу сказать что поле el.title варчарное
16 авг 11, 14:50    [11126694]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
ther
сразу хочу сказать что поле el.title варчарное
Т.е. вы кастите варчарное поле к инту, а потом удивляетесь, что оно не все откастило и еще и ругается?
16 авг 11, 14:52    [11126711]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
ther
kDnZP
все данные поля el.title приведены в результате...там как вы видите нет '12243254325436543254354325435432543543'
Т.е. про "Cool PC" сервер сам все придумал?
16 авг 11, 14:53    [11126714]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
ther
Member

Откуда:
Сообщений: 839
та не...может я не правильно логику понимаю...но я думал что он откастит после выборки..а получается что он все кастит а потом выбирает?
16 авг 11, 14:54    [11126721]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
ther
та не...может я не правильно логику понимаю...но я думал что он откастит после выборки..а получается что он все кастит а потом выбирает?
Дело не в логике, а в физике. В плане посмотрите, и все увидите.
16 авг 11, 14:55    [11126727]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
ther
Member

Откуда:
Сообщений: 839
в общем пасиб...просто решил загнать 7 справочников в одну таблицу....вот и грабли
alexeyvg
пасиб...заюзал..работает
16 авг 11, 15:05    [11126825]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7498
ther
просто решил загнать 7 справочников в одну таблицу...

Три мудреца в одном тазу
Пустились по морю в грозу.
Будь попрочнее старый таз,
Длиннее был бы мой рассказ.

Насколько обосновано решение пихать справочники в одну таблицу?
16 авг 11, 15:32    [11127155]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31961
ther
а получается что он все кастит а потом выбирает?
Это может быть выгоднее. Сервер выбирает план, исходя из статистики распределения данных, а не из, например, порядка таблиц в запросе.
16 авг 11, 15:36    [11127197]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
ther
Member

Откуда:
Сообщений: 839
env
из того что они имеют одинаковую структуру
16 авг 11, 15:38    [11127232]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
ther
Member

Откуда:
Сообщений: 839
черт а в 2008 серваке прошел запрос вида
select el.id,cast(el.Title as int) Title from Spr_Element el
join Spr_Models mo on mo.ID=el.ModelID and mo.[Type]=4
16 авг 11, 15:40    [11127260]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ther
черт а в 2008 серваке прошел запрос вида
select el.id,cast(el.Title as int) Title from Spr_Element el
join Spr_Models mo on mo.ID=el.ModelID and mo.[Type]=4
Зависит от выбранного оптимизатором плана.
Оптимизатор в разных версиях разный.
В следующий раз порядок выполнения запроса поменяется - и будет ошибка.
16 авг 11, 15:45    [11127319]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
ther
Member

Откуда:
Сообщений: 839
а не..не схавал..не с той копии восстановил
16 авг 11, 15:45    [11127320]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
Glory
Member

Откуда:
Сообщений: 104751
ther
из того что они имеют одинаковую структуру

А хранить данные в полях неправильного типа это тоже обязывает ?
16 авг 11, 15:47    [11127344]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
ther
черт а в 2008 серваке прошел запрос вида
select el.id,cast(el.Title as int) Title from Spr_Element el
join Spr_Models mo on mo.ID=el.ModelID and mo.[Type]=4

Ну теперь-то вы представляете какая эта серьезная грабля))), она жеж элементарно может выстрелить, когда статистика поменяется. Так что - пишите как предложил alexeyvg (ну или аналогичными способами) в любом случае, не закладываясь на то, что в выборке всегда будет int.
16 авг 11, 15:47    [11127349]     Ответить | Цитировать Сообщить модератору
 Re: поясните плз почему такая фигня  [new]
ther
Member

Откуда:
Сообщений: 839
Glory
на самом деле это первый проект когда я решил все в кучу сбросить..обычно у меня все по полкам было разнесено...поэтому раньше у меня не было необходимости приводить типы...и я даж подумать не мог что запрос именно так будет выполняться...ну в общем на будущее я вывод сделал
16 авг 11, 16:23    [11127690]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить