OUTPUT子句中的join / subquery

时间:2013-04-05 16:23:20

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

我正在使用TSQL OUTPUT子句更新表并添加有关更改的数据。问题是更新的表只包含我想要输出的数据的规范化ID,我需要以人类可读的形式。这是一个简单的例子来说明我的意思

CREATE TABLE LOCATION
(locationid INT, name VARCHAR(50))

CREATE TABLE USER
(userid INT, username VARCHAR(50), locationid INT)

--insert some test data

UPDATE USER
SET locationid = @somevalue
WHERE userid = @someothervalue

我知道我可以添加类似

的内容
OUTPUT inserted.username
+ ' location changed from ' + deleted.locationid
+ ' to ' + inserted.locationid

但对于想要知道位置名称而不是数据库ID的最终用户来说,这没有用处。 我尝试将deleted.locationid替换为(SELECT name from LOCATION WHERE locationid = deleted.locationid),同样替换inserted.locationid并遇到错误Subqueries are not allowed in the OUTPUT clause

我已经看到一些答案说OUTPUT子句中允许连接,但我没有找到一种方法可以单独加入inserteddeleted。这可能是SQL Server 2008 R2中的一个步骤,还是我需要通过存储旧值和新值的中间步骤来实现,然后在第二个查询中加入我需要的输出?

3 个答案:

答案 0 :(得分:3)

以下Microsoft文章Output清楚地描述了输出子句在任何DML操作(如插入,更新和删除)中的限制。

它还描述了您不能将子查询与输出子句

一起使用

所以在这里你可以记录插入和删除的行以及表变量中的locationid,并且可以使用与位置表的连接进一步获取位置名称

实施例

INSERT INTO location VALUES(1,'Delhi')
INSERT INTO location VALUES(2,'Noida')


INSERT INTO [USER] VALUES(1,'Sandeep',1)

DECLARE  @result table(UserName varchar(50), OldLocationId Int,NewLocaionId Int)


UPDATE [USER] SET locationid=2
OUTPUT  INSERTED.UserName, DELETED.locationid,INSERTED.locationid INTO @result
WHERE userid=1

SELECT * FROM @result

答案 1 :(得分:0)

为什么不:

OUTPUT inserted.username
+ ' location changed from ' + deleted.name + ' to ' + inserted.name

答案 2 :(得分:-1)

将您的联接和删除联合到子查询中并加入其中。