2015-06-24 66 views
0

我试图更新表,并然而,在同一查询返回一些值,返回位于链接表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如何知道w WHERE子句所指的那个帽子?在我看来,查询的UPDATE和FROM部分都符合WHERE子句的条件,那么WHERE子句将限制哪些行更新或哪些行出现在输出中或两者兼而有之?

在我的测试中,我也看到Sql Server要求将表标识符添加到WHERE子句中,因为我无法挑选出原因或模式,因此tbla中提到的UPDATE语句的一部分隐式标识为“a”,因为我已经将它与在FROM语句中的名称混淆了?如果是这样的“a”引用插入或删除?如果我没有在别的地方提到哪个版本的tbla.akey会引用它?

我一直没能找到这是怎样工作的任何可辨认的文件,并从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

WHERE子句属于更新! OUTPUT子句只是返回updatet,但afaik不可能像派生表一样使用输出或类似的东西 – CeOnSql

回答

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 
+0

虽然这是我提出的示例问题的一个很好的解决方案,但我真的很期待理解UPDATE,OUTPUT,FROM和WHERE子句之间的关系,而不是找到解决我发明的问题来解释我的困惑。但是,感谢发布聪明的代码,这是一个好主意,整齐地回避了整个问题 – user3498178

+0

我知道它很累,但是经历过这绝不是一个坏主意:https://msdn.microsoft.com/de-de/library/ms177523 (v = sql.120)的.aspx – CeOnSql