在 SQL 中检索记录后立即更新表
Posted
技术标签:
【中文标题】在 SQL 中检索记录后立即更新表【英文标题】:Update table right after the record is retrieved in SQL 【发布时间】:2020-07-31 10:38:36 【问题描述】:我有一个 SQL 查询,它检索所有具有 [STAT_TG] = 'INSERTED' 的记录并将输出转换为 XML 文件,最后将所有具有 [STAT_TG] = 'INSERTED' 的记录更新为 [STAT_TG] = '删除'。我的要求是在将记录检索到 XML 后立即更新 [STAT_TG] 字段。 我的查询如下。
BEGIN
SELECT * FROM
(
SELECT
PXTXTP,
PXTXCD,
PXACCD
FROM [RecordDetails].[dbo].[Records]
WHERE [STAT_TG] = 'INSERTED'
) AS "Transaction"
FOR XML AUTO, ELEMENTS, ROOT('DataArea')
UPDATE [RecordDetails].[dbo].[Records]
SET [STAT_TG] = 'DELETED'
FROM [RecordDetails].[dbo].[Records]
WHERE [STAT_TG] = 'INSERTED'
end
此表正在从另一个系统更新,并且一直在更新。对于开发要求,此查询计划为 1 秒。因此,有时当标志更新为 [STAT_TG] = 'DELETED' 时,未检索到的记录也会更新为 DELETED,并且它们不会出现在输出 XML 文件中。 因此,有人可以帮助我实现这一目标吗?
【问题讨论】:
为什么你没有工作? 看来您应该分别存储正在处理的行的 ID,然后应该将其用于UPDATE
表,而不是假设您的 SELECT
之间的行没有变化和UPDATE
声明。如果我正确阅读了这些行。
或者,您可以使用相反的方法:UPDATE...OUTPUT inserted.* INTO @table and generate the xml from @table
(来自输出,即更新的行)。
嗨@Larnu 是的,您是正确的,但是如何存储从表中检索到的记录的 ID。你能证明一下吗?
...@cetin-basoz 回答
【参考方案1】:
假设这些字段的类型都是 varchar(10),这里有一个示例:
DECLARE @data TABLE
(
PXTXTP VARCHAR(10)
, PXTXCD VARCHAR(10)
, PXACCD VARCHAR(10)
);
UPDATE [RecordDetails].[dbo].[Records]
SET [STAT_TG]='DELETED'
OUTPUT
inserted.PXTXTP, inserted.PXTXCD, inserted.PXACCD
INTO @data
WHERE [STAT_TG]='INSERTED';
SELECT *
FROM
(SELECT PXTXTP, PXTXCD, PXACCD FROM @data) AS "Transaction"
FOR XML AUTO, ELEMENTS, ROOT('DataArea');
【讨论】:
以上是关于在 SQL 中检索记录后立即更新表的主要内容,如果未能解决你的问题,请参考以下文章
只要它们不存在于另一个表T-SQL中,就从一个表中检索记录[重复]
如何将从 ms 访问表中检索到的记录插入到 sql server 表中?