0

更新するテーブルからいくつかの値を選択し、すぐに更新する必要があります。さらに、更新されたレコードごとに 1 つの新しいレコードをテーブルに挿入する必要があります。レコードを選択して更新するには、次のような構造を使用しています

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句があっても、すべてを 1 つのステートメントで行うことはできませんか?

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 を別の動的クエリ内に配置する必要があります。)

最後の号で、1 ステートメントの制限が最終的に破られると思います。

では、代わりに、次のようにしてみませんか。

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 に答える