Удалить оператор с переменной после DELETE - PullRequest
0 голосов
/ 08 февраля 2011

Может кто-нибудь объяснить, что это делает?Я имею в виду @comps сразу после удаления - документы, кажется, предполагают, что это помещает удаленные строки в @comps, это правда?@comps является табличной переменной.

delete @comps
from @comps as a
where a.compcode = '43423'

Ответы [ 3 ]

5 голосов
/ 08 февраля 2011

Вы читаете документы неправильно.Чтобы поместить удаленные строки в табличную переменную, вы должны использовать предложение OUTPUT (см. Пример g в BOL )

Соответствующая часть синтаксиса здесь

DELETE 
    [ FROM ] 
    { <object> | rowset_function_limited 
    [ FROM <table_source> [ ,...n ] ] 

В вашем запросе отсутствует первый необязательный FROM, поэтому первая ссылка на @comps является целевой таблицей для удаления.Второй (псевдоним) задокументирован в BOL следующим образом:

FROM <table_source>

Указывает дополнительное предложение FROM.Это расширение Transact-SQL для DELETE позволяет указывать данные и удалять соответствующие строки из таблицы в первом предложении FROM.

Это расширение, задающее соединение, может использоваться вместо подзапроса в предложении WHERE дляидентифицируйте строки, которые нужно удалить.

С точки зрения объяснения того, что происходит в вашем запросе, однако документации, похоже, не хватает.Самостоятельное объединение обрабатывается иначе, чем объединение за другим столом.

declare @comps table (compcode char(5))
declare @T table (compcode char(5))

INSERT INTO @comps VALUES ('12345')
INSERT INTO @comps VALUES ('43423')

/*Copy the table*/
insert into @T
select * from @comps

delete @comps
from @T as a
where a.compcode = '43423'

select * from @comps /*The table is empty. For every row in @comps the 
                       join on a.compcode = '43423' returns a match so
                       all rows get deleted*/



/*Add back the deleted rows*/
INSERT INTO @comps VALUES ('12345')
INSERT INTO @comps VALUES ('43423')

/*Try the self join*/
delete @comps
from @comps as a
where a.compcode = '43423'

SELECT * FROM @comps /*Returns 12345*/

Планы ниже

External Join

Self Join

0 голосов
/ 08 февраля 2011

@ comps и a - это одна и та же таблица, на которую ссылаются разные псевдонимы.

Это также верно и делает то же самое.

delete a
from @comps as a
where a.compcode = '43423'

Тот факт, что это то же самое,лучшее шоу с этим примером

delete @comps
from @comps as a
  inner join @comps as b
    on a.compcode = b.compcode
where a.compcode = '43423'

Это даст вам ошибку

Msg 8154, Level 16, State 1, Line 9
The table '@comps' is ambiguous.

SQL Server не знает, с какого @comps удалить, a или b.

Редактировать 1 Теперь я вижу, что это, вероятно, больше комментарий к посту Мартина.Не ответ на ФП о том, что находится в документах.

0 голосов
/ 08 февраля 2011

Да, вы правы.В этом коде "@comps" может быть только табличной переменной.

Вы также можете написать

delete from @comps where compcode = '43423'

Это полностью эквивалентно

...