有人可以请解释这是什么吗?我指的是@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