簡體   English   中英

在SQL Server 2005中使用OUTPUT INTO復制表行

[英]Copy table rows using OUTPUT INTO in SQL Server 2005

我有一個表,我需要將記錄從表復制回自身。 作為其中的一部分,我想使用OUTPUT子句將新行捕獲到表變量中,以便我可以在同一過程中對行執行其他操作。 我希望每一行都包含其新密鑰和從中復制的密鑰 這是一個人為的示例:

INSERT 
    MyTable (myText1, myText2) -- myId is an IDENTITY column
OUTPUT  
    Inserted.myId, 
    Inserted.myText1, 
    Inserted.myText2 
INTO
    -- How do I get previousId into this table variable AND the newly inserted ID? 
    @MyTable    
SELECT 
    -- MyTable.myId AS previousId,
    MyTable.myText1,
    MyTable.myText2
FROM
    MyTable
WHERE
    ...

如果INSERT上的列數與SELECT語句中的列數不匹配,則SQL Server會發出吠聲。 因此,如果將列添加到MyTable中,我可以看到它如何工作,但這不是一個選擇。 以前,這是通過游標實現的,這會導致性能瓶頸-我有意避免這種情況。

如何在保留復制行的鍵的同時復制這些記錄,以實現最高的性能?

我不清楚上下文-這是在AFTER INSERT觸發器中。

無論如何,我看不出有任何方法可以在一個電話中做到這一點。 OUTPUT子句僅允許您返回已插入的行。 我建議如下:

DECLARE @MyTable (
    myID INT, 
    previousID INT, 
    myText1 VARCHAR(20), 
    myText2 VARCHAR(20)
)

INSERT @MyTable (previousID, myText1, myText2) 
SELECT myID, myText1, myText2 FROM inserted

INSERT MyTable (myText1, myText2) 
SELECT myText1, myText2 FROM inserted

-- @@IDENTITY now points to the last identity value inserted, so...
UPDATE m SET myID = i.newID
FROM @myTable m, (SELECT @@IDENTITY - ROW_NUMBER() OVER(ORDER BY myID DESC) + 1 AS newID, myID FROM inserted) i
WHERE m.previousID = i.myID

...

當然,您不會將其放入AFTER INSERT觸發器中,因為它將給您遞歸調用,但是您可以在INSTEAD OF INSERT觸發器中進行。 我可能在遞歸問題上錯了; 我總是避免遞歸調用,所以我從來沒有真正發現過。 但是,使用@@ IDENTITY和ROW_NUMBER()是我過去幾次使用過的技巧來做類似的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM