![](/img/trans.png)
[英]In which cases can INNER JOIN (SELECT … not be rewritten using temp table
[英]Which is better to select IDs of updated data: Join with Temp table or using OUTPUT INTO?
我想选择更新数据的 ID 并将它们返回给客户端。 哪种方式更好?
1-使用 OUTPUT INTO :
DECLARE @TempE TABLE (
Id BIGINT NOT NULL,
Token VARCHAR(36) NOT NULL
);
UPDATE [dbo].[MyTable]
SET [State] = 3 -- Expired
OUTPUT Deleted.[Id], Deleted.[Token]
INTO @TempE
WHERE [ExpireDate] < GETDATEUTC();
SELECT Id,
Token
FROM @TempE;
2-使用临时表,使用 join 更新:
SELECT
[E].[Id],
[E].[Token]
INTO #tempTb
FROM [dbo].[MyTable]
WHERE [ExpireDate] < GETUTCDATE();
UPDATE [M]
SET [M].[State] = 3 -- Expired
FROM [dbo].[MyTable] AS [M]
INNER JOIN #tempTb AS [T] ON [T].[Id] = [M].[Id];
SELECT Id,
Token
FROM #tempTb;
服务器为SQL Server 2016,预计每次执行更新不超过500行。
谢谢你的帮助 :)
正如我在评论中提到的,这里不需要表变量/临时表,只需OUTPUT
结果集:
UPDATE [dbo].[MyTable]
SET [State] = 3 -- Expired
OUTPUT inserted.[Id], inserted.[Token]
WHERE [ExpireDate] < GETDATEUTC();
另外,就我个人而言,我会在这里使用inserted
,而不是deleted
,尽管它们在这种情况下在语义上应该是相同的(除非您触发了影响UPDATE
中Token
或Id
值的东西)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.