更新查询中的TSql输出

时间:2015-06-24 12:34:45

标签: sql-server sql-server-2008 tsql

我尝试更新表并在同一查询中返回一些值,但要返回的值之一位于链接表中

由于子查询(对我来说似乎完全明确)在输出子句中是不允许的,我尝试使用带有连接的输出自语法来编写查询,但这似乎是我生成所有各种歧义

例如考虑以下查询:

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

1 个答案:

答案 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