2013-08-28 164 views
1

我正在嘗試創建一個存儲過程(MS SQL Server 2012),該過程複製多個行,然後將它們插入同一個表中並將其關聯到不同的外部表。在複製的行上,我們還會更改updateddate和createddate以及創建和更新這些新插入行的用戶。在存儲過程中從插入調用存儲過程

這一切都很好,直到我們來到主鍵。數據庫是Sage CRM的數據庫 - 它使用存儲過程(eware_get_identity_id)爲我們插入的表獲取下一個主鍵ID。這eware_get_identity_id存儲過程進行各種插入,更新和刪除到其他表,所以我們不能使用函數。我們無法更改數據庫的組成,因此將列的類型更改爲標識規範也不是一個選項。

我想做的事情(我知道我做不到)是一樣的東西下面。

ALTER PROCEDURE Lead_CopySecuritiesToOpp 
    @lead_leadID int, 
    @oppo_opportunityID int, 
    @user_userID int 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    INSERT INTO Security 
      (<columns hidden for clarity>,secu_CreatedDate,secu_UpdatedDate,secu_CreatedBy,secu_UpdatedBy, 
         secu_LeadId, secu_CaseId,secu_SecurityID) 
    SELECT <columns hidden for clarity>, GETDATE() as secu_CreatedDate, GETDATE() as secu_UpdatedDate, @user_userID as secu_CreatedBy, 
      @user_userID as secu_UpdatedBy, NULL as secu_LeadId, @oppo_opportunityID as secu_CaseId, 
      (exec [dbo].[eware_get_identity_id] 'Security') as secu_SecurityID 
     FROM   Security 
     WHERE  (secu_LeadId = @lead_leadID) 

END 
GO 

顯然,我不能以這種方式執行存儲過程內嵌((EXEC [DBO] [ eware_get_identity_id]'Security')as secu_SecurityID)。如果Sage SP沒有更改數據,那麼它的功能是理想的,但它確實如此,所以這不是一個選項。任何人都可以提出一個更好的方式來做到這一點我曾考慮訴諸遊標,或者可能是臨時表來在插入前獲取數據?建議請。

+0

你有沒有考慮過它是交易?假設你只是調用插入/更新等的sprocs,你應該能夠將整個操作包裝在一個事務中,並且回滾應該會出現任何問題。然後,您可以安全地調用身份生成函數並插入爲兩個單獨的語句,而不會出現數據庫不一致的情況,如果出現錯誤 – Charleh

+0

如果您不能更改數據庫的組成,那麼如何創建/更改此Lead_CopySecuritiesToOpp'存儲過程?是否有一些內容可以*更改/添加到數據庫中? – RBarryYoung

+0

嗯,你看過一個叫做'eware_get_identity_id_range'的東西嗎?看起來它是爲了解決這個問題而寫的。看到這裏:https://community.sagecrm.com/user_community/f/84/p/3205/10691.aspx#10691,後提提及它是一半左右... – RBarryYoung

回答

0

我結束了使用遊標執行每行的SP。一次只能執行一行或兩行 - 所以這個解決方案是有效的(即使它不完全美麗)。

ALTER PROCEDURE Lead_CopySecuritiesToOppo 
    -- Add the parameters for the stored procedure here 
    @lead_leadID int, 
    @oppo_opportunityID int, 
    @user_userID int 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    declare @secu_SecurityID char(11) 
    declare @newsecu_SecurityID int 

    set rowcount 0 
    select * into #mytemp from Security where secu_LeadId = @lead_leadID 

    set rowcount 1 

    select @secu_SecurityID = secu_SecurityID from #mytemp 

    --Cursor through all the returned security rows 
    while @@rowcount <> 0 
    begin 
     set rowcount 0 

     --Get the next ID 
     EXEC @newsecu_SecurityID = [dbo].[eware_get_identity_id] 'Security' 

     --Insert this row into the security table 
     INSERT INTO Security 
         (secu_TimeStamp, secu_Deleted, secu_Secterr, secu_Name, 
         secu_Status, secu_propType, secu_typeN, secu_noBeds, secu_noFloors, secu_noFlats, secu_purpBuilt, secu_stanConst, 
         secu_stanConstN, secu_yearBuilt, secu_tenure, secu_leaseLeft, secu_exLEA, secu_exLEAN, secu_adjComP, secu_adjComPN, secu_letToFam, 
         secu_letToFamN, secu_tenType, secu_purPrice, secu_purPrice_CID, secu_purchasedDate, secu_estValue, secu_estValue_CID, secu_reinstval, 
         secu_reinstval_CID, secu_rentInc, secu_rentInc_CID, secu_valCont, secu_valTel, secu_loanType, secu_address1, secu_address2, secu_address3, 
         secu_address4, secu_postcode, secu_primary,secu_CreatedDate,secu_UpdatedDate,secu_CreatedBy,secu_UpdatedBy, 
          secu_LeadId, secu_CaseId,secu_SecurityID) 
     SELECT    secu_TimeStamp, secu_Deleted, secu_Secterr, secu_Name, 
          secu_Status, secu_propType, secu_typeN, secu_noBeds, secu_noFloors, secu_noFlats, secu_purpBuilt, secu_stanConst, 
          secu_stanConstN, secu_yearBuilt, secu_tenure, secu_leaseLeft, secu_exLEA, secu_exLEAN, secu_adjComP, secu_adjComPN, secu_letToFam, 
          secu_letToFamN, secu_tenType, secu_purPrice, secu_purPrice_CID, secu_purchasedDate, secu_estValue, secu_estValue_CID, secu_reinstval, 
          secu_reinstval_CID, secu_rentInc, secu_rentInc_CID, secu_valCont, secu_valTel, secu_loanType, secu_address1, secu_address2, secu_address3, 
          secu_address4, secu_postcode, secu_primary, GETDATE() as secu_CreatedDate, GETDATE() as secu_UpdatedDate, @user_userID as secu_CreatedBy, 
          @user_userID as secu_UpdatedBy, NULL as secu_LeadId, @oppo_opportunityID as secu_CaseId, @newsecu_SecurityID as secu_SecurityID 
     FROM   #mytemp where secu_SecurityID = @secu_SecurityID 

     delete #mytemp where secu_SecurityID = @secu_SecurityID 

     set rowcount 1 
     select @secu_SecurityID = secu_SecurityID from #mytemp 
    end 
    set rowcount 0 

END 
GO