有人可以請解釋這是什麼嗎?我指的是@comps
刪除後 - 文檔似乎建議它將刪除的行放入@comps
,這是真的嗎? @comps
是一個表變量。DELETE刪除變量後的語句
delete @comps
from @comps as a
where a.compcode = '43423'
有人可以請解釋這是什麼嗎?我指的是@comps
刪除後 - 文檔似乎建議它將刪除的行放入@comps
,這是真的嗎? @comps
是一個表變量。DELETE刪除變量後的語句
delete @comps
from @comps as a
where a.compcode = '43423'
是的,你是對的。在此代碼中,「@comps」只能是表變量。
你也可以寫
delete from @comps where compcode = '43423'
這是完全等價
您正在閱讀的文檔錯誤。爲了把刪除的行到一個表變量,你會使用OUTPUT
條款(見例如g
in BOL爲)
這裏的語法的相關部分
DELETE
[ FROM ]
{ <object> | rowset_function_limited
[ FROM <table_source> [ ,...n ] ]
您的查詢缺少可選的第一個FROM
所以第一次參考@comps
是刪除的目標表。第二(化名參考)中BOL進行了說明如下
FROM
<table_source>
指定附加的FROM子句。 對DELETE 的此Transact-SQL擴展允許從 指定數據並刪除 第一個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*/
這些計劃是下面
@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 我現在看到,這可能是更多的評論馬丁的職位。對於OP中關於文檔內容的回答不是一個答案。
我不認爲這是有效的T-SQL。 http://msdn.microsoft.com/en-us/library/ms189835.aspx – Oded 2011-02-08 13:03:39
@Oded也許,但它的工作原理...我已經測試MsSql2005 – BertuPG 2011-02-08 13:15:40