2011-06-21 12 views
0

更新するテーブルからいくつかの値を選択し、すぐに更新する必要があります。さらに、更新されたレコードごとに1つの新しいレコードをテーブルに挿入する必要があります。レコードを選択して、私は今更新からのINSERT INTO SELECT

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

のような構造を使用しています更新するには、挿入部のために、私はこのようにOUTPUT句を利用して、INSERT INTO SELECTUPDATE声明をラップしたいと思います。しかし、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つのステートメントでそれをすべて行うことができません不平を言いますか?

答えて

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   
) 

念ではない - あなたは再び更新された行を挿入しようとしていますか?

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

いいえ、私は 'RecordID'を取得し、別のデータを新しい行を挿入したいです。 –

+0

更新されたすべての行のレコードIDが取得され、別のテーブルまたは他の列に挿入できます。 – DanNsk

+0

あなたは正しいですが、 'TableA'には動作しない制約がある場合... –

0

出力を使用して、あるテーブルから別のテーブルに更新された行を挿入することは可能です: しかし、私はあなたが働くために使用しているその構文を作ることはできません。 チェックしてください。このlink

0

、あなたこのような何かを試みることができる

  1. あなたはリンクサーバーを作成する必要があると思いますがyourserver

  2. 'リモート'クエリはあまり迅速ではありません。

  3. TOP (5)TOP (@Something)に置き換えるのは難しいでしょう。実際には、おそらく文全体を動的なクエリにする必要があります。 (そう、あなたは別の動的問合せの内側すでに動的更新を配置する必要があると思います。)

私は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;