2013-08-28 2 views
1

여러 행을 복사 한 다음 저장 프로 시저 (MS SQL Server 2012)를 만들고 다른 외부에 연결하여 동일한 테이블에 다시 삽입하려고합니다. 표. 복사 된 행에서 updateddate 및 createddate는 물론이 새로운 삽입 된 행을 작성 및 업데이트 한 사용자도 변경합니다.저장 프로 시저의 삽입에서 저장 프로 시저 호출

기본 키가 나올 때까지 모든 것이 정상적으로 작동합니다. 데이터베이스는 Sage CRM의 데이터베이스입니다.이 테이블은 저장 프로 시저 (eware_get_identity_id)를 사용하여 삽입 할 테이블의 다음 기본 키 ID를 가져옵니다. 이 eware_get_identity_id가 저장된 proc은 다른 테이블에 다양한 삽입, 업데이트 및 삭제를 수행하므로 대신 함수를 사용할 수 없습니다. 우리는 데이터베이스의 구성을 변경할 수 없으므로 열의 유형을 Identity 사양으로 변경하는 것도 옵션이 아닙니다.

는 내가하고 싶은 (그리고 내가 할 수없는 알고있는 것은) 아래 같은 것입니다 :.

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 

가 분명 나는이 방법으로 저장 프로 시저를 인라인으로 실행할 수 없습니다 ((간부 인 [DBO] eware_get_identity_id] 'Security')를 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