【问题标题】:INSERT INTO SELECT from UPDATE从更新中插入选择
【发布时间】:2011-06-21 12:24:41
【问题描述】:

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

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 子句,我不能在一个语句中完成所有操作吗?

【问题讨论】:

    标签: sql-server-2005 insert-select


    【解决方案1】:
    UPDATE TableA SET SomeField = 1 
    OUTPUT inserted.RecordID, GETDATE() into TableA (RecordID , DT)
    FROM TableA 
    WHERE RecordID IN
    (        
        SELECT TOP @Something RecordID FROM TableA        
    )
    

    只是不确定 - 您正在尝试再次插入更新的行?

    【讨论】:

    • 不,我想获取RecordID 并插入一个包含不同数据的新行。
    • 您将在那里获得所有更新行的记录 ID,您可以将其插入到另一个表或其他列中。
    【解决方案2】:

    可以使用输出将更新的行从一个表插入到另一个表: 但是,我无法使您使用的语法能够正常工作。 请查看此link

    【讨论】:

      【解决方案3】:

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

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-25
        • 1970-01-01
        • 2013-12-05
        • 2010-09-17
        • 1970-01-01
        • 2021-11-22
        • 2016-03-20
        • 1970-01-01
        相关资源
        最近更新 更多