2010-07-02 53 views
5

我從一個SQL服務器數據庫插入記錄到另一個。我需要獲取新插入的id並更新源表上的字段。我可以用INSERTED選項獲得新的ID沒問題。但是,我似乎無法從源表中獲取ID。目標表中沒有用於源ID的字段。源表是一個轉換表,我不想用轉換字段污染目標表。這可能是不可能的,但我想我會先與你們覈對一下。SQL Server插入語句使用INSERTED獲取新ID和現有ID

drop table #Table1 
CREATE TABLE #Table1 
(
    Table1ID INT, 
    Table2ID INT, 
    NAME VARCHAR(32) 
) 

INSERT INTO #Table1 
VALUES 
     (1, NULL, 'Fred') 
    ,(2, NULL, 'Tom') 
    ,(3, NULL, 'Sally')  

--ok, im inserting into #Table2 
drop table #Table2 
CREATE TABLE #Table2 
(
    [Table2ID] [int] IDENTITY(1,1) NOT NULL, 
    NAME VARCHAR(32) 
) 

--THE RUB, I want to insert Table2ID into table3 
--along with Table1ID. I cannot seem to reference table1 
--Any Ideas? 
insert into #Table2(NAME) 
OUTPUT INSERTED.Table2ID, T.Table1ID into #Table3 
select Name from #Table1 T 

回答

5

你不能用INSERT做(正弦它缺乏一個從它自己的條款),但你可以用MERGE做到這一點:

MERGE INTO #Table2 as t2 
USING #Table1 as t1 ON 0=1 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (NAME) VALUES (t1.NAME) 
OUTPUT INSERTED.Table2ID, t1.Table1ID ; 
+0

它像一個冠軍......感謝Remus! – Steve 2010-07-02 19:14:26

1

將轉換ID字段放在表中。這不會污染表格,它正在正確處理問題。另外,您可以在輸出子句中將其恢復出來。而且它也會使更新子表更簡單。我看不出有什麼理由不這樣做,除非你的開發人員在生產代碼中使用Select *。

+0

我們正在生成從數據庫的模型,我試圖避免採取額外的步驟不公開模型上的轉換ID。我認爲你的建議可能是處理轉換的最合適的方式。 – Steve 2010-07-02 18:31:45