2011-08-06 36 views
0

因此,假設我們有一個表t1,我們需要將每個插入的行復制到t2中,並在它們之間放置外鍵鏈接。讓我告訴我的意思:有沒有辦法在視圖中獲取插入的縮進?

我們有表T1

----------------------------- 
| id | value | external_id| 
----------------------------- 
| |   |   | 
----------------------------- 

和表T2

---------------- 
| id | value | 
---------------- 
| |   | 
---------------- 

其中id列具有IDENTITY標記和EXTERNAL_ID是一個鏈接到t2.id(I」將在下面解釋)

我們打算將行(value ='TEST')插入到表t1中。預期的結果是這樣的:

----------------------------- 
| id | value | external_id| 
----------------------------- 
| 123| TEST | 345  | 
----------------------------- 

和表T2

---------------- 
| id | value | 
---------------- 
| 345| TEST | 
---------------- 

algorythm的主要思想是基於觸發器:在INSTEAD OF觸發對錶1我做的:

  1. 插入到t1並記住插入的ID在一個單獨的表中使用OUTPUT子句
  2. 插入到t2並記住馬使用映射

OUTPUT

  • 更新external_id柱再次pping (t1.id, t2.id)但是,有一些我不明白怎麼打的一些問題:

    1. T1實際上不是一個表,它是一個視圖與INSTEAD OF觸發器(但這不是一個問題)
    2. t2也是一個觸發視圖,這是一個問題,因爲我不能從它插入的ID
    3. 此外t2是一個遠程視圖 - 這是一個大問題,因爲在使用遠程視圖時存在一些限制

    所以,也許我正朝着一個錯誤的方向前進?有沒有辦法解決我的問題,而不使用光標和存儲過程在t1上的觸發器? (我的意思是我知道有一種方法可以通過存儲過程將所有數據存入t2,並在該過程的OUTPUT參數中獲取插入的id,但也許有更優雅的方式?)

  • 回答

    0

    對我來說似乎是,如果t1需要從t2開始,而不是反過來,你應該使t1的INSTEAD觸發器先插入t2,然後t1。您可以將插入的OUTPUT子句用於t2。

    +0

    不幸的是我不能在遠程表或視圖上使用OUTPUT子句。所以可能存儲過程是唯一的選擇。 – Dima

    +0

    因此,您正在創建sp以在t2坐的服務器上執行t2插入,對嗎?所以你仍然會先執行t2插入,然後使用返回的id來執行t1插入。 – Bill

    +0

    不,目前的解決方案是這樣的:1.插入t1。 2.將數據打包到xml中,並將其插入帶有sp的t2中。 3.更新t1 – Dima

    0

    使用來自第一次插入的存儲過程@@ Identity

    +0

    感謝您的建議,但@@身份不會解決問題的情況下,當多個值插入到table1中時。 – Dima

    +0

    你是說第1步:插入T1。第2步:插入T2。步驟3:用步驟2中的T2.ID更新t1? –

    +0

    是的,這是開始的想法 – Dima

    0

    剛剛在桌子上獲得最大ID的情況如何?

    DECLARE @SomethingID INT 
    SELECT @SomethingID = MAX(SomethingID) FROM SomethingTable 
    
    +0

    這是不安全的,因爲在插入和選擇最大(id)查詢之間有人可以執行另一個插入操作並破壞整個邏輯 – Dima

    +0

    是的,這是一個好點 –

    +0

    看看這個問題。它可能有助於解決最大問題:鎖定幾個表將會是壞 –

    相關問題