OUTPUT 子句中的连接/子查询

Jal*_*opa 1 sql t-sql sql-server 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
Run Code Online (Sandbox Code Playgroud)

我知道我可以添加类似的东西

OUTPUT inserted.username
+ ' location changed from ' + deleted.locationid
+ ' to ' + inserted.locationid
Run Code Online (Sandbox Code Playgroud)

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

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

San*_*mar 6

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

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

因此,您可以在此处记录插入和删除的行以及表变量中的 locationid,并可以使用 join with 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
Run Code Online (Sandbox Code Playgroud)