0

我需要从表中选择一些要更新的值,然后立即更新它们。此外,我需要在表中为每个更新的记录插入一个新记录。要选择记录和更新,我使用了类似的结构

UPDATE TableA SET SomeField = 1 OUTPUT RecordID FROM TableA WHERE RecordID IN
(    
    SELECT TOP @Something RecordID FROM TableA    
)

现在,对于插入部分,我想将UPDATE语句包装成一个INSERT INTO SELECT,从而利用该OUTPUT子句。但是,当我这样做时,SQL 会抱怨

INSERT INTO TableA SELECT ( RecordID , GETDATE() ) FROM
(
    UPDATE TableA SET SomeField = 1 OUTPUT RecordID FROM TableA WHERE RecordID IN
    (        
        SELECT TOP @Something RecordID FROM TableA        
    )
)

OUTPUT即使使用该子句,我也不能在一个语句中完成所有操作吗?

4

3 回答 3

2
UPDATE TableA SET SomeField = 1 
OUTPUT inserted.RecordID, GETDATE() into TableA (RecordID , DT)
FROM TableA 
WHERE RecordID IN
(        
    SELECT TOP @Something RecordID FROM TableA        
)

只是不确定-您要再次插入更新的行吗?

于 2011-06-21T12:49:27.970 回答
0

可以使用输出将更新的行从一个表插入到另一个表:但是我无法使您使用的语法起作用。请查看此链接

于 2011-06-21T12:30:26.003 回答
0

当然,你可以尝试这样的事情:

INSERT INTO TableA (RecordID, Value)
SELECT RecordID, GETDATE()
FROM OPENQUERY(
  yourserver,
  'UPDATE TableA
  SET SomeField = 1
  OUTPUT inserted.RecordID
  WHERE RecordID IN (SELECT TOP (5) RecordID FROM TableA)'
)

但是这种方法有几个问题:

  1. 您需要创建一个链接服务器yourserver

  2. “远程”查询不会很快。

  3. 你很难TOP (5)TOP (@Something). 实际上,您很可能必须将整个语句转换为动态查询。(没错,您必须将已经动态的 UPDATE 放在另一个动态查询中。)

我预计,在最后一期中,单一语句的限制最终会被打破。

所以,相反,为什么不这样:

DECLARE @tmpRecords TABLE (RecordID int);

UPDATE TableA
SET SomeField = 1
OUTPUT inserted.RecordID INTO @tmpRecords (RecordID)
WHERE RecordID IN (SELECT TOP (@Something) RecordID FROM TableA);

INSERT INTO TableA (RecordID, SomeDateColumn)
SELECT RecordID, GETDATE()
FROM @tmpRecords;
于 2011-06-21T13:44:21.083 回答