Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нет ошибки отсутствующего поля / 6 сообщений из 6, страница 1 из 1
24.05.2019, 10:59
    #39817591
Sandist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нет ошибки отсутствующего поля
Здравствуйте, помогите понять пожалуйста:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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



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


вы заметите, что в таблице #id_tts отсутствует поле id_tov, тем не менее запрос отрабатывает без ошибки
почему так происходит?
...
Рейтинг: 0 / 0
24.05.2019, 11:20
    #39817616
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нет ошибки отсутствующего поля
Sandistв таблице #id_tts отсутствует поле id_tov, тем не менее запрос отрабатывает без ошибки
почему так происходит?В подзапросе видны не только поля таблиц этого подзапроса,
но и все поля внешних запросов. В первую очередь, если у поля не задано имя таблицы или алиас,
считается, что оно из одной из таблиц подзапроса. Если же там такого поля нет, то оно ищется у ближайшего внешнего запроса, затем у внешнего по отношению к внешнему и т.д.
При этом в подзапросе вместо поля используется его значение из текущей строки внешнего запроса.

Вывод: всегда пишите алиасы у всех полей во всех запросах! И не будут возникать такие вот вопросы...
...
Рейтинг: 0 / 0
24.05.2019, 11:21
    #39817619
Sandist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нет ошибки отсутствующего поля
iap,
точно! спасибо большое!
...
Рейтинг: 0 / 0
24.05.2019, 11:34
    #39817638
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нет ошибки отсутствующего поля
Sandistiap,
точно! спасибо большое!Неплохо завести привычку всегда использовать алиасы, и никогда не писать имя поля без алиаса, даже для запросов из одной таблицы.
...
Рейтинг: 0 / 0
24.05.2019, 11:37
    #39817641
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нет ошибки отсутствующего поля
alexeyvgSandistiap,
точно! спасибо большое!Неплохо завести привычку всегда использовать алиасы, и никогда не писать имя поля без алиаса, даже для запросов из одной таблицы.Главное, не только пропадут такие ошибки, и не надо будет тратить время на поиски, но и ускорится чтение запросов.
Когда вы через год будете править этот запрос:Sandist
Код: sql
1.
2.
3.
4.
5.
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

или ещё бюолее сложный, вам не нужно будет при чтении запроса постоянно лазить в определения таблиц (а если они ещё не рядом, как тут, а разбросаны?), и искать, откуда какое поле взялось.
...
Рейтинг: 0 / 0
24.05.2019, 11:49
    #39817651
Sandist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нет ошибки отсутствующего поля
alexeyvg,
спасибо большое за помощь
это не мой запрос, я смотрю запрос написанный др человеком и не мог понять почему он не работает
то есть как раз тот вариант про который вы говорите, сложно определять ошибку спустя время когда запрос может быть забыт
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нет ошибки отсутствующего поля / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]