DELETE后删除带变量的语句

时间:2011-02-08 13:01:47

标签: tsql sql-delete

有人可以解释这是做什么的吗?我在删除后直接引用@comps - 文档似乎建议将已删除的行放入@comps,这是真的吗? @comps是一个表变量。

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

3 个答案:

答案 0 :(得分:5)

您正在阅读文档错误。要将已删除的行放入表变量,您可以使用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*/

计划如下

External Join

Self Join

答案 1 :(得分:0)

是的,你是对的。在此代码中,“@ comps”只能是表变量。

你也可以写

delete from @comps where compcode = '43423'

完全等同于

答案 2 :(得分: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不知道要删除哪个@comp,a或b。

修改1 我现在看到,这可能更像是对马丁的帖子的评论。 OP不是对文档内容的回答。