我正在执行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
答案 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