2016-02-24 121 views
0

我創建了一個存儲過程在一個數據庫一樣插入或更新EM表插入或更新存儲過程

ALTER PROCEDURE [dbo].[uspInsertorUpdateArchibusINF] 
@em_TT AS em_TT READONLY 
AS 
BEGIN 
SET NOCOUNT ON; 

BEGIN TRANSACTION; 

    UPDATE e 
    SET e.dp_id     = t.dp_id, 
     e.dv_id     = t.dv_id, 
     e.email     = t.email, 
     e.emergency_relation = t.emergency_relation, 
     e.name_first   = t.name_first, 
     e.name_last    = t.name_last, 
     e.option1    = t.option1, 
     e.status    = t.status, 
     e.em_title    = t.em_title, 
     e.date_hired   = t.date_hired 
    FROM [dbo].[em] e 
    INNER JOIN @em_TT t ON e.em_id = t.em_id 

    INSERT INTO [dbo].[em](dp_id, dv_id, email, emergency_relation, name_first,name_last 
            , option1, status, em_id, em_title,date_hired) 
    SELECT t.dp_id, t.dv_id, t.email 
     , t.emergency_relation,t.name_first,t.name_last, t.option1, t.status 
     , t.em_id, t.em_title, t.date_hired 
    FROM @em_TT t 
    WHERE NOT EXISTS (SELECT 1 
        FROM [dbo].[em] 
        WHERE em_id = t.em_id) 
COMMIT TRANSACTION; 

END; 

凡DP_ID和dv_id在EM表是從表中的dv和DP的外鍵。所以現在我嘗試插入一些新值到em表中,它會拋出錯誤,如 INSERT語句與FOREIGN KEY約束「em_dp_id」衝突。數據庫「j20」發生衝突,表「dbo.dp」。

不,我不知道如果我可以修改上面的存儲過程te插入,如果有新的dp_id或dv_id在各自的表。或者我必須單獨創建它。任何幫助非常感謝

回答

0

如果您將有需要做插入的信息,您可以將插入添加到此存儲過程中的其他表。如果該表有12個必填字段,並且您只知道該ID的名稱,那麼您不能在此處執行此操作。但是,如果所有進入該表的人都說出身份證和開始日期,那麼可以。你是否想成爲下面討論的另一個問題。

貴公司設定的業務規則將決定在此時插入該表是否是一個好主意。您可能會遇到應用程序不支持某些ID的情況。 (例如,在我們的例子中,我們有時會支持一些客戶的銷售力量,但並不是所有的銷售力量。)在這種情況下,插入即使您擁有所有需要的數據也不是好主意。這可能是因爲這些信息只能來自經過批准的來源,然後再次插入將是錯誤的地方。這些是互聯網上的陌生人無法回答的問題,您必須諮詢給您要求的人。

另一種可能性是您在插入時加入到表中,以免發生錯誤。這是你想要做的,如果你不應該插入父表。我個人會建議用一個異常表來實現這個功能,在這個異常表中插入那些不能被插入的異常表格,或者在被拒絕時將它們過濾到用戶。這很大程度上取決於整個系統的工作方式,以及這些來自用戶還是文件導入。

另一方面,您的更新存在缺陷,因爲它基於連接更新了表中的每條記錄,而不是從現有數據更改的任何記錄。取決於有多少條記錄,這可能是一個性能問題。更新十條記錄不必要,沒什麼大不了,更新10,000,000條?可能是一個問題。

相關問題