选择更新数据的ID哪个更好:与Temp表联接还是使用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- 使用临时表,使用连接进行更新

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,尽管在这种情况下它们在语义上应该是相同的(除非您有触发某些影响的条件) TokenIdUPDATE的值)。