我正在使用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子句中允许连接,但我没有找到一种方法可以单独加入inserted
和deleted
。这可能是SQL Server 2008 R2中的一个步骤,还是我需要通过存储旧值和新值的中间步骤来实现,然后在第二个查询中加入我需要的输出?
答案 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)
将您的联接和删除联合到子查询中并加入其中。