2011-02-08 98 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中关于文档内容的回答不是一个答案。