我尝试更新表并在同一查询中返回一些值,但要返回的值之一位于链接表中
由于子查询(对我来说似乎完全明确)在输出子句中是不允许的,我尝试使用带有连接的输出自语法来编写查询,但这似乎是我生成所有各种歧义
例如考虑以下查询:
UPDATE tbla SET datecol=CURRENT_TIMESTAMP
OUTPUT deleted.datecol AS old, inserted.datecol AS new, b.col2
FROM tbla a LEFT JOIN tblb b ON a.bkey=b.bkey
WHERE akey=6
Sql Server如何知道WHERE子句引用的内容?在我看来,查询的UPDATE和FROM部分都有资格获得WHERE子句,那么WHERE子句是否会限制哪些行更新或哪些行出现在输出中或两者都有?
在我的测试中,我也看到过,在我无法找出原因或模式的情况下,Sql Server要求将表标识符添加到WHERE子句中,所以引用的tbla也是如此在声明的UPDATE部分隐式标识为" a"因为我把它作为FROM语句中的别名?如果是这样的话," a"引用插入或删除?如果我没有别名,那么该表的哪个版本会引用?
我无法找到有关其工作原理的任何可辨认文档,而且在我测试时从SQL Server返回的消息只会让我更加困惑
我也很想知道为什么不允许以下查询,因为它似乎是做同样事情的完美无瑕的方式,当然一点都不含糊,而且更加自我解释
UPDATE tbla SET datecol=CURRENT_TIMESTAMP
OUTPUT deleted.datecol AS old, inserted.datecol AS new,
(SELECT TOP(1) b.col2 FROM tblb b WHERE deleted.bkey = b.bkey) AS col2
WHERE akey=6
答案 0 :(得分:0)
您可以将输出写入表变量,然后使用它:
在你的情况下可能看起来像那样:
DECLARE @output TABLE
(
bkey INT,
datecolold DATETIME,
datecolnew DATETIME
)
UPDATE tbla SET datecol=CURRENT_TIMESTAMP
OUTPUT deleted.bkey, deleted.datecol, inserted.datecol INTO @output
WHERE akey=6
SELECT b.col2, o.* FROM @output o INNER JOIN tblb b ON o.bkey = b.bkey