1

我正在使用 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

inserted我已经看到几个答案说在 OUTPUT 子句中允许加入,但我还没有找到在and上单独加入的方法deleted。这是否可以在 SQL Server 2008 R2 中的一个步骤中完成,或者我是否需要通过存储旧值和新值的中间步骤然后加入第二个查询以获得我需要的输出?

4

3 回答 3

6

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

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

因此,您可以在此处记录插入和删除行以及表变量中的 locationid,并可以使用与 Location 表的连接进一步获取位置名称

例子

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
于 2013-04-05T18:23:24.500 回答
1

为什么不:

OUTPUT inserted.username
+ ' location changed from ' + deleted.name + ' to ' + inserted.name
于 2013-04-05T16:33:02.733 回答
0

将您的加入和删除联合到一个子查询中并加入它。

于 2013-04-05T18:05:54.603 回答