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

Откуда:
Сообщений: 1197
Столкнулся со странной ошибкой CONVERT

Есть такая табла
create PartnersUnique
partner int


и есть такая вью
View Partners 
as 
select distinct cast(partner  as int) as partner
	from partners
	where  isnumeric(partner) = 1  


когда я делаю
такой запрос
select * from PartnersUnique a 
join Partners  b 
on a.partner = b.partner 


выдается ошибка на view Partners
автор
Conversion failed when converting the varchar value 'N_A' to data type int.

так как в таблице partners из которой берет данные view действиетльно есть не интовые строки
когда меняю вью на следующий вид, то все работает хорошо

View Partners 
as 
select distinct cast(partner  as [b]float[/b]) as partner
	from partners
	where  isnumeric(partner) = 1  


Вопросы:
1. почему вообще выдается ошибка, если я во вью всё отфильтровал уже, а только потом делаю джойн на таблицу?
Или вью работает, что сначала делает джойн, а потом накладывает свою секцию where?
2. почему второе решение работает?
23 фев 17, 10:24    [20239385]     Ответить | Цитировать Сообщить модератору
 Re: В чем прикол конверта?  [new]
o-o
Guest
relief
Или вью работает, что сначала делает джойн, а потом накладывает свою секцию where?
2. почему второе решение работает?

сделайте селект из обеих вью, запросив оценочный план.
и увидите различие, где в плане стоит filter
23 фев 17, 10:29    [20239396]     Ответить | Цитировать Сообщить модератору
 Re: В чем прикол конверта?  [new]
relief
Member

Откуда:
Сообщений: 1197
o-o
relief
Или вью работает, что сначала делает джойн, а потом накладывает свою секцию where?
2. почему второе решение работает?

сделайте селект из обеих вью, запросив оценочный план.
и увидите различие, где в плане стоит filter


да. В предикате сначала идет непосредственно джойн, а потом проверка в самом вью
 isnumeric(partner) = 1  

а это сервер всегда так делает или зависит от разных условий?

как можно тогда с данной ситуацией справится?
23 фев 17, 10:38    [20239421]     Ответить | Цитировать Сообщить модератору
 Re: В чем прикол конверта?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
relief,

автор
а это сервер всегда так делает или зависит от разных условий?

сервер разворачивает представление до таблиц всегда(ну кроме индексных с параметром), в зависимости от условий накладывать будет как посчитает выгодным.


автор
как можно тогда с данной ситуацией справится?

TRY_CONVERT вместо CAST
23 фев 17, 10:47    [20239437]     Ответить | Цитировать Сообщить модератору
 Re: В чем прикол конверта?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31427
relief
а это сервер всегда так делает или зависит от разных условий?
Зависит от того, как выгоднее.
relief
как можно тогда с данной ситуацией справится?
Сделать во вью CASE
23 фев 17, 16:38    [20240027]     Ответить | Цитировать Сообщить модератору
 Re: В чем прикол конверта?  [new]
juwdoks
Member

Откуда:
Сообщений: 144
ещё может зависеть от разных версий оптимизаторов
у меня при переходе с 2008r2 на 2014 аналогично полетели некоторые джоины

различие именно шаге применения фильтра
23 фев 17, 18:06    [20240171]     Ответить | Цитировать Сообщить модератору
 Re: В чем прикол конверта?  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
relief
Вопросы:
1. почему вообще выдается ошибка, если я во вью всё отфильтровал уже, а только потом делаю джойн на таблицу?
Или вью работает, что сначала делает джойн, а потом накладывает свою секцию where?
2. почему второе решение работает?
Вьюшка - синтаксический сахар. Она для удобства программиста. Сервер перед оптимизацией сначала разворачивает все вьюшки. Потому не важно, где написан джойн и where, во вьюшке или самом запросе. А уж как он оптимизирует - это сложно сказать. Вообще, надо стараться писать запросы, не зависящие от тонкости работы оптимизатора. Ибо при смене версии сервера или банально увеличении количества строк в таблице и изменении статистики может внезапно вылететь сюрприз. И сразу много.
23 фев 17, 19:45    [20240347]     Ответить | Цитировать Сообщить модератору
 Re: В чем прикол конверта?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33929
Блог
relief
Столкнулся со странной ошибкой CONVERT

Есть такая табла
create PartnersUnique
partner int


и есть такая вью
View Partners 
as 
select distinct cast(partner  as int) as partner
	from partners
	where  isnumeric(partner) = 1  



зачем cast и isnumeric?!
24 фев 17, 02:26    [20240947]     Ответить | Цитировать Сообщить модератору
 Re: В чем прикол конверта?  [new]
vborets
Member

Откуда:
Сообщений: 165
как такое возможно?

автор
в таблице partners из которой берет данные view действиетльно есть не интовые строки
24 фев 17, 11:14    [20241226]     Ответить | Цитировать Сообщить модератору
 Re: В чем прикол конверта?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
vborets
как такое возможно?

автор
в таблице partners из которой берет данные view действиетльно есть не интовые строки

подумайте
24 фев 17, 11:15    [20241228]     Ответить | Цитировать Сообщить модератору
 Re: В чем прикол конверта?  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
Критик
relief
Столкнулся со странной ошибкой CONVERT

Есть такая табла
create PartnersUnique
partner int



и есть такая вью
View Partners 
as 
select distinct cast(partner  as int) as partner
	from partners
	where  isnumeric(partner) = 1  




зачем cast и isnumeric?!
Он почему-то полагает, что ISNUMERIC возвращает 1 только для типа INT,
а WHERE обязательно выполняется сервером до SELECTа
24 фев 17, 16:41    [20241836]     Ответить | Цитировать Сообщить модератору
 Re: В чем прикол конверта?  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8724
Если версия сиквела старая, то сначала выбирается таблица по условию - как подзапрос или через CTE , а потом уже её значения обрабатываются. Кстати, так можно и съоптимизировать запрос (а можно, кстати, и наоборот - ДЕоптимизировать, особенно в случае CTE :( .... )...
25 фев 17, 14:28    [20243038]     Ответить | Цитировать Сообщить модератору
 Re: В чем прикол конверта?  [new]
o-o
Guest
SIMPLicity_
Если версия сиквела старая, то сначала выбирается таблица по условию - как подзапрос или через CTE , а потом уже её значения обрабатываются

...и получит он все ту же ошибку, т.к. CTE будет раскрыто ровно в исходный код
25 фев 17, 21:41    [20243723]     Ответить | Цитировать Сообщить модератору
 Re: В чем прикол конверта?  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8724
o-o
SIMPLicity_
Если версия сиквела старая, то сначала выбирается таблица по условию - как подзапрос или через CTE , а потом уже её значения обрабатываются

...и получит он все ту же ошибку, т.к. CTE будет раскрыто ровно в исходный код

Нда.... ? Странно, у меня нормально прокатило.

PS Хрен его знает,- может это от конкретного SELECT зависит, может - от работы оптимизатора... У меня там ещё outer apply замешан,- именно в нём ссылка на CTE-таблицу... кажется...
27 фев 17, 01:41    [20245606]     Ответить | Цитировать Сообщить модератору
 Re: В чем прикол конверта?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31427
SIMPLicity_
Нда.... ? Странно, у меня нормально прокатило.

PS Хрен его знает,- может это от конкретного SELECT зависит,
Зависит от конкретного SELECT, и от конкретных данных (статистики по таблицам)
Может раскрывать как угодно.
Единственное гарантированно работающее решение, для любых данных и любых запросов, как я уже написал - CASE во вьюхе.
27 фев 17, 09:50    [20245983]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить