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

Откуда:
Сообщений: 395
Здравствуйте, помогите понять пожалуйста:

Declare  @Number_r int, @id_tovs nvarchar(max), @id_tts nvarchar(max)
set @Number_r = 9285
set @id_tovs = '22664'
set @id_tts = '12205'

If OBJECT_ID('tempdb..#id_tovs') is not null    Drop Table #id_tovs
create table #id_tovs (id_tov int)
insert into #id_tovs select a.val from master..ParsingStr(@id_tovs, ',') as a

If OBJECT_ID('tempdb..#id_tts') is not null    Drop Table #id_tts
create table #id_tts (id_tt int)
insert into #id_tts select a.val from master..ParsingStr(@id_tts, ',') as a

SELECT '[tt_tov_kontr_init]', *  FROM [M2].[dbo].[tt_tov_kontr_init](nolock)
where Number_r IN (@Number_r , - @Number_r)
and (id_tov in (select id_tov from #id_tovs) or @id_tovs = '')
and (id_tt in (select id_tov from #id_tts) or @id_tts = '')
order by id_tt


Есть такой запрос, если обратите внимание на строку
and (id_tt in (select id_tov from #id_tts) or @id_tts = '')

вы заметите, что в таблице #id_tts отсутствует поле id_tov, тем не менее запрос отрабатывает без ошибки
почему так происходит?
24 май 19, 10:59    [21892891]     Ответить | Цитировать Сообщить модератору
 Re: Нет ошибки отсутствующего поля  [new]
iap
Member

Откуда: Москва
Сообщений: 46833
Sandist
в таблице #id_tts отсутствует поле id_tov, тем не менее запрос отрабатывает без ошибки
почему так происходит?
В подзапросе видны не только поля таблиц этого подзапроса,
но и все поля внешних запросов. В первую очередь, если у поля не задано имя таблицы или алиас,
считается, что оно из одной из таблиц подзапроса. Если же там такого поля нет, то оно ищется у ближайшего внешнего запроса, затем у внешнего по отношению к внешнему и т.д.
При этом в подзапросе вместо поля используется его значение из текущей строки внешнего запроса.

Вывод: всегда пишите алиасы у всех полей во всех запросах! И не будут возникать такие вот вопросы...
24 май 19, 11:20    [21892928]     Ответить | Цитировать Сообщить модератору
 Re: Нет ошибки отсутствующего поля  [new]
Sandist
Member

Откуда:
Сообщений: 395
iap,
точно! спасибо большое!
24 май 19, 11:21    [21892931]     Ответить | Цитировать Сообщить модератору
 Re: Нет ошибки отсутствующего поля  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29011
Sandist
iap,
точно! спасибо большое!
Неплохо завести привычку всегда использовать алиасы, и никогда не писать имя поля без алиаса, даже для запросов из одной таблицы.
24 май 19, 11:34    [21892954]     Ответить | Цитировать Сообщить модератору
 Re: Нет ошибки отсутствующего поля  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29011
alexeyvg
Sandist
iap,
точно! спасибо большое!
Неплохо завести привычку всегда использовать алиасы, и никогда не писать имя поля без алиаса, даже для запросов из одной таблицы.
Главное, не только пропадут такие ошибки, и не надо будет тратить время на поиски, но и ускорится чтение запросов.
Когда вы через год будете править этот запрос:
Sandist
SELECT '[tt_tov_kontr_init]', *  FROM [M2].[dbo].[tt_tov_kontr_init](nolock)
where Number_r IN (@Number_r , - @Number_r)
and (id_tov in (select id_tov from #id_tovs) or @id_tovs = '')
and (id_tt in (select id_tov from #id_tts) or @id_tts = '')
order by id_tt
или ещё бюолее сложный, вам не нужно будет при чтении запроса постоянно лазить в определения таблиц (а если они ещё не рядом, как тут, а разбросаны?), и искать, откуда какое поле взялось.
24 май 19, 11:37    [21892959]     Ответить | Цитировать Сообщить модератору
 Re: Нет ошибки отсутствующего поля  [new]
Sandist
Member

Откуда:
Сообщений: 395
alexeyvg,
спасибо большое за помощь
это не мой запрос, я смотрю запрос написанный др человеком и не мог понять почему он не работает
то есть как раз тот вариант про который вы говорите, сложно определять ошибку спустя время когда запрос может быть забыт
24 май 19, 11:49    [21892975]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить