Почему не происходит обновление? это намеренное поведение? - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь понять, почему это обновление не дает сбоя, и вместо этого обновляет таблицу, даже если подзапрос содержит неверное имя столбца, которого нет в таблице, из которой он выбирается.Если вы выполняете подзапрос самостоятельно, он возвращает синтаксическую ошибку.Не должно ли произойти сбой обновления и выдать ошибку?Как это интерпретируется?Сотрудник предположил, что он может интерпретировать это как перекрестное применение, является ли это возможностью?

Create table MyTable(column1 nvarchar(max), column2 nvarchar(max) , exclude nvarchar(max))
Create table MyTable2(c1 varchar)

INSERT INTO MyTable (column1, column2, exclude)
VALUES
    ('Fred', 'Smith',0),
    ('John', 'Smith',0),
    ('Michael', 'Smith',0),
    ('Robert', 'Smith',0);

INSERT INTO MyTable2
  ( c1)
VALUES
  ('x' ), 
  ('y'), 
  ('w'),
  ('n')

  Update [MyTable]  set [exclude] = 1 where [column1] in (select [column1] from [MyTable2])

  drop table MyTable
  drop table MyTable2

В подзапросе для обновления Column1 не существует.Несмотря на это, обновление выполняется в каждой строке таблицы.Если вы выполняете подзапрос самостоятельно, он возвращает синтаксическую ошибку.

Ожидаемое поведение: обновление завершится неудачно, и транзакция будет откатана

1 Ответ

3 голосов
/ 07 июня 2019

Да.Ожидаемое.[column1] находится в области действия подзапроса, поскольку существует во внешнем запросе.

Например, для множества запросов, таких как:

 Update [MyTable]  
 set [exclude] = 1 
 where exists (select * from [MyTable2] where c1 = [column1])

Это допустимо и необходимо ссылаться на столбцы извнешний запрос в подзапросе.

Как указывает @ IłyaBursov, это одна из многих причин всегда ставить префикс ваших ссылок на столбцы с псевдонимами таблиц.

например:

 Update [MyTable] t  
 set t.[exclude] = 1 
 where t.[column1] in (select t2.[column1] from [MyTable2] t2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...