在 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 中检索记录后立即更新表的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询从链接表中检索最后一条记录[重复]

只要它们不存在于另一个表T-SQL中,就从一个表中检索记录[重复]

如何将从 ms 访问表中检索到的记录插入到 sql server 表中?

数据库缓慢检索/更新/插入问题,每个表中有超过 500 万条记录

SQL /peewee。如何根据另一个表的条件更新记录?

sql insert into 插入记录后返回记录的ID