select 更新数据的 ID 哪个更好:加入 Temp table 还是使用 OUTPUT INTO?
Which is better to select IDs of updated data: Join with Temp table or using OUTPUT INTO?
我想 select 更新数据的 ID 并 return 给客户端。哪种方式更好?
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- 使用临时 table,使用连接更新 :
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;
服务器为SQLServer 2016,预计每次执行更新不超过500行。
感谢您的帮助:)
正如我在评论中提到的,这里不需要 table variable/temporary table,只需 OUTPUT
结果集:
UPDATE [dbo].[MyTable]
SET [State] = 3 -- Expired
OUTPUT inserted.[Id], inserted.[Token]
WHERE [ExpireDate] < GETDATEUTC();
此外,就我个人而言,我会在这里使用 inserted
,而不是 deleted
,尽管在这种情况下它们 应该 在语义上相同(除非你有在 UPDATE
).
中影响 Token
或 Id
值的触发器
我想 select 更新数据的 ID 并 return 给客户端。哪种方式更好?
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- 使用临时 table,使用连接更新 :
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;
服务器为SQLServer 2016,预计每次执行更新不超过500行。
感谢您的帮助:)
正如我在评论中提到的,这里不需要 table variable/temporary table,只需 OUTPUT
结果集:
UPDATE [dbo].[MyTable]
SET [State] = 3 -- Expired
OUTPUT inserted.[Id], inserted.[Token]
WHERE [ExpireDate] < GETDATEUTC();
此外,就我个人而言,我会在这里使用 inserted
,而不是 deleted
,尽管在这种情况下它们 应该 在语义上相同(除非你有在 UPDATE
).
Token
或 Id
值的触发器