2011-06-21 180 views
0

我需要從表中選擇一些值進行更新,然後立即更新它們。此外,我需要在每個更新記錄的表格中插入一條新記錄。要選擇記錄和更新我使用的是結構類似INSERT INTO SELECT UPDATE

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條款?

回答

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   
) 

只是不知道 - 你試圖再次插入更新的行?

+1

不,我想'RecordID'並插入一個新行,不同的數據。 –

+0

您將獲得所有更新行的記錄ID,您可以將其插入另一個表或另一列。 – DanNsk

+0

你是對的,但如果'TableA'有任何限制,將無法工作... –

0

使用輸出將更新的行從一個表插入另一個表是可行的: 但是,我無法使用您正在使用的語法來工作。 請看看這個link

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;