#sql-server #tsql
#sql-server #tsql
Вопрос:
У меня есть следующий пример кода:
create table #tempmembers (
memberid int
)
update Members set
Member_EMail = NULL
where Member_ID in (select member_id from #tempmembers)
Подвыборка содержит ошибку, поскольку #tempmembes
не содержит столбец с именем member_id
, но инструкции sql выполняются БЕЗ каких-либо ошибок и не обновляют строки.
Если я затем добавлю только ОДНУ строку в #tempmembers
:
create table #tempmembers (
memberid int
)
insert into #tempmembers select 1
update Members set
Member_EMail = NULL
where Member_ID in (select member_id from #tempmembers)
он по-прежнему выполняется без каких-либо ошибок — но на этот раз будут затронуты ВСЕ записи в элементах.
Почему инструкция SQL не завершается полным завершением работы? И если подвыборка с ошибкой оценивается как NULL — должно ли обновление всех строк в Members
происходить не только в том случае, если это было:
update Members set
Member_EMail = NULL
where Member_ID not in (select member_id from #tempmembers)
Ответ №1:
Он наследуется member_id
от внешнего запроса, поэтому эквивалентен:
...
(select Members.member_id from #tempmembers)
Это завершится ошибкой, как и ожидалось:
...
(select #tempmembers.member_id from #tempmembers)
Комментарии:
1. Super: S Почему он это делает? Это MS пытается быть милой и позволить нам обойтись без префикса coloumns — и затем открывается, чтобы это произошло?
2. Это может быть ошибка, лучше всегда указывать в подзапросе; msdn.microsoft.com/en-us/library/ms178050.aspx
3. Это потому, что в этом случае имя столбца уникально внутри полного запроса, поэтому ошибок не возникло. Вопрос, почему внешнему запросу необходимо возвращать свой собственный столбец? Я не уверен, но, возможно, есть пример, где вам действительно нужна такая логика. MS SQL решила, что это запрос такого рода.