有人可以解释这是做什么的吗?我指的是@comps删除后的直接 - 文档似乎建议将删除的行放入@comps,这是真的吗? @comps是一个表变量.
delete @comps
from @comps as a
where a.compcode = '43423'
Run Code Online (Sandbox Code Playgroud)
你正在阅读错误的文档.要将删除的行放入表变量中,您将使用该OUTPUT子句(请参阅g BOL中的示例)
这里语法的相关部分是
DELETE
[ FROM ]
{ <object> | rowset_function_limited
[ FROM <table_source> [ ,...n ] ]
Run Code Online (Sandbox Code Playgroud)
您的查询缺少第一个可选项,FROM因此第一个引用@comps是要删除的目标表.第二个(别名参考)记录在BOL中,如下所示
从
<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*/
Run Code Online (Sandbox Code Playgroud)
计划如下


| 归档时间: |
|
| 查看次数: |
319 次 |
| 最近记录: |