2011-02-08 107 views
0

有人可以請解釋這是什麼嗎?我指的是@comps刪除後 - 文檔似乎建議它將刪除的行放入@comps,這是真的嗎? @comps是一個表變量。DELETE刪除變量後的語句

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

我不認爲這是有效的T-SQL。 http://msdn.microsoft.com/en-us/library/ms189835.aspx – Oded 2011-02-08 13:03:39

+0

@Oded也許,但它的工作原理...我已經測試MsSql2005 – BertuPG 2011-02-08 13:15:40

回答

0

是的,你是對的。在此代碼中,「@comps」只能是表變量。

你也可以寫

delete from @comps where compcode = '43423' 

這是完全等價

5

您正在閱讀的文檔錯誤。爲了把刪除的行到一個表變量,你會使用OUTPUT條款(見例如gin 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*/ 

這些計劃是下面

External Join

Self Join

0

@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中關於文檔內容的回答不是一個答案。