Sql 输出子句中的联接/子查询

Sql 输出子句中的联接/子查询,sql,sql-server,tsql,sql-server-2008-r2,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 UPDA

我正在更新一个表,并使用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的最终用户来说,这是没有用的。 我尝试从locationid=deleted.locationid的位置将deleted.locationid替换为SELECT name,同样,对于inserted.locationid和遇到错误时,OUTPUT子句中不允许子查询

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

为什么不可以:

OUTPUT inserted.username
+ ' location changed from ' + deleted.name + ' to ' + inserted.name
为什么不:

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

将您的联接和删除合并到子查询并在其上联接。

将您的联接和删除合并到子查询并在其上联接。

下面的Microsoft文章清楚地描述了任何DML操作(如insert、update和delete)中output子句的限制

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

因此,在这里,您可以从插入和删除的行和表变量中记录locationid,并可以使用join with location table进一步获取位置名称

范例

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

下面的Microsoft文章清楚地描述了任何DML操作(如insert、update和delete)中output子句的限制

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

因此,在这里,您可以从插入和删除的行和表变量中记录locationid,并可以使用join with location table进一步获取位置名称

范例

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

我没有更新位置,因此没有inserted.name或deleted.name。我没有更新位置,因此没有inserted.name或deleted.nameOK,因此它确实需要中间步骤。这很公平。好吧,这确实需要一个中间步骤。很公平。