1

多数の行をコピーし、別の外部テーブルへの関連付けを使用して同じテーブルに挿入するストアド プロシージャ (MS SQL Server 2012) を作成しようとしています。コピーされた行では、更新日と作成日、およびこれらの新しく挿入された行を作成および更新したユーザーも変更します。

主キーに到達するまで、これはすべて正常に機能します。データベースは Sage CRM のものです。これはストアド プロシージャ (eware_get_identity_id) を使用して、挿入先のテーブルの次のプライマリ キー ID を取得します。この eware_get_identity_id ストアド プロシージャは、他のテーブルに対してさまざまな挿入、更新、および削除を行うため、代わりに関数を使用することはできません。データベースの構成を変更することはできないため、列のタイプを 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

明らかに、この方法でストアド プロシージャをインラインで実行することはできません ( (exec [dbo].[eware_get_identity_id] 'Security') as secu_SecurityID )。Sage SP がデータを変更しなかった場合、関数は理想的ですが、変更するため、これはオプションではありません。誰でもこれを行うためのより良い方法を提案できますか? 挿入の直前にデータを取得するために、カーソル、またはおそらく一時テーブルに頼ることを考えましたか? 提案してください。

4

1 に答える 1

0

結局、カーソルを使用して各行の SP を実行しました。一度に実行される行は 1 つまたは 2 つだけなので、この解決策はうまくいきます (正確に美しくはない場合でも)。

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
于 2013-08-29T11:05:09.787 に答える