SQL Server-使用内部联接进行更新,也使用内部联接进行输出

时间:2018-10-29 14:13:02

标签: sql-server sql-server-2017

我正在执行Update_1,但是现在我需要将更新后的行返回给我的用户,因此我正在寻找OUTPUT,我尝试了Update_2,但无法正常工作。 我真的很想学习如何使用OUTPUT,也许对您的查询没有意义,所以我翻译了查询并将其简称为更好的理解。我们需要通过套接字将更新的行发送给客户的基本方法,一旦我已经在inserted中拥有更新的ID,我想在不执行选择的情况下进行此操作,但是我知道这是不可能的。 谢谢您的帮助。

Update_1:

UPDATE items
SET items.status = 'sold-out'
FROM items
INNER JOIN orderDetail
ON orderDetail.itemId = items.id
WHERE orderDetail.id = 7

Update_2:

UPDATE items
SET items.status = 'sold-out'
FROM items
INNER JOIN orderDetail
ON orderDetail.itemId = items.id
WHERE orderDetail.id = 7
OUTPUT items.id, items.description, orderDetail.id
FROM items
INNER JOIN orderDetail
ON orderDetail.itemId = items.id
WHERE items.id = inserted.id

2 个答案:

答案 0 :(得分:1)

OUTPUT紧接SET子句之后。您可以从inserted或稍后在FROM子句中提到的任何表中进行选择。看来您应该拥有:

UPDATE items
SET items.status = 'sold-out'
OUTPUT inserted.id, inserted.description, orderDetail.id
FROM items
INNER JOIN orderDetail
ON orderDetail.itemId = items.id
WHERE orderDetail.id = 7

您应该始终参考whole statement的语法,以了解各种T-SQL如何组合在一起。

答案 1 :(得分:0)

从文档看来,您要执行的操作似乎无法正常工作。输出语句以类似于触发器的方式使用“虚拟”插入和删除表。一个示例语句:

UPDATE Production.Document  
SET DocumentSummary .WRITE (N'features',28,10)  
OUTPUT deleted.DocumentSummary,   
       inserted.DocumentSummary   
    INTO @MyTableVar  
WHERE Title = N'Front Reflector Bracket Installation';  

所以要做你想做的事是这样的:

DECLARE @temptable table (  
    id int,
    description nvarchar(max));  

UPDATE items
SET items.status = 'sold-out'
FROM items
INNER JOIN orderDetail
ON orderDetail.itemId = items.id
WHERE orderDetail.id = 7
OUTPUT inserted.id, inserted.description into @temptable

select @temptable.id, @temptable.description, orderdetail.id as orderdetailid
FROM @temptable
INNER JOIN orderDetail
ON orderDetail.itemId = @temptable.id

我不保证上面的代码可以正确编译,但是可以为您提供一个思路。输出子句的文档在这里:https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-2017