1

ストアドプロシージャは初めてです。あるdtabaseから別のデータベースにテーブルをコピーするストアドプロシージャを作成しました。データが宛先テーブルに追加されるたびにストアドプロシージャを実行すると、実行ごとに行数が増加していました。

問題の解決にご協力ください。ループ内で問題が発生することを願っています。

私のSPは:

--exec mall

alter procedure mall
as
begin
    declare @mallid int
    declare @mallname nvarchar(40)
    declare @mallstatus nvarchar(40)
    declare @malludsuomid nchar(2)
    declare @malludsassetcode nvarchar(6)
    declare @malludsassettype nvarchar(15)
    declare @malludsremarks nvarchar(max)
    declare @malludsdwdb int
    declare @mallsecterr int
    declare @mallassetid int
    declare @secterr int
    declare @Maxmallid int
    declare @mallentityid int

    Select @mallentityid = customtable.Bord_TableId From CRM.dbo.Custom_Tables as customtable With (NoLock) Where Upper(Bord_Caption) = Upper('Mall') And Bord_Deleted Is Null
    DECLARE cur_address CURSOR FOR

            SELECT 
            udsasset.Asset_ID,udsasset.Asset_Name,udsasset.Asset_Status,udsasset.UOM_ID, udsasset.Asset_Code,udsasset.Asset_Type,udsasset.Remarks,udsasset.DW_Key_Source_DB --,crmterr.TPro_SecTerr
        from 
            CMA_UDS.dbo.Dim_Asset as udsasset           

    OPEN  cur_address
    FETCH NEXT FROM cur_address INTO @mallid,@mallname,@mallstatus,@malludsuomid,@malludsassetcode,@malludsassettype,@malludsremarks,@malludsdwdb --,@mallsecterr
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
        if not exists (select crmmall.mall_MallID from CRM.dbo.Mall as crmmall where crmmall.mall_MallID = @mallid)
        begin
            exec @Maxmallid = CRM.dbo.crm_next_id @Table_Id=@mallentityid
            insert into 
                CRM.dbo.Mall
                    (mall_MallID,mall_Name,mall_Status,mall_uds_UOMID,mall_uds_asset_code,mall_uds_asset_type,
                    mall_uds_remarks,mall_uds_dw_db,mall_CreatedBy,mall_CreatedDate,mall_Secterr,mall_AMOSUploaded,mall_asset_id)
            values(@Maxmallid,@mallname,@mallstatus,@malludsuomid,@malludsassetcode,@malludsassettype,@malludsremarks,@malludsdwdb,1,GETDATE(),
                @mallsecterr,GETDATE(),@mallid)
        end
        else
        begin
            update 
                CRM.dbo.Mall 
            set 
                mall_asset_id=@mallid,mall_Name = @mallname,mall_Status=@mallstatus,mall_uds_UOMID =@malludsuomid,mall_uds_asset_code=@malludsassetcode,
                mall_uds_asset_type=@malludsassettype,mall_uds_remarks=@malludsremarks,mall_uds_dw_db=@malludsdwdb,mall_UpdatedBy=1, 
                mall_UpdatedDate=GETDATE(),mall_Secterr=@mallsecterr,mall_AMOSUploaded=GETDATE() 
            where 
                mall_MallID=@mallid
        end
        FETCH NEXT FROM cur_address INTO @mallid,@mallname,@mallstatus,@malludsuomid,@malludsassetcode,@malludsassettype,@malludsremarks,@malludsdwdb--,@mallsecterr
    end
    CLOSE cur_address 
    DEALLOCATE cur_address
End
4

1 に答える 1

0

crm_next_idに値として挿入しているのにmall_MallID、同じIDを使用して比較し@mallid、レコードがすでに挿入されているかどうかを確認するのはなぜですか?たとえば、id5があり、idの新しいレコードを150挿入した場合、SPを再度実行したときに、レコードがすでに挿入されていることはわかりません。次の実行では、id 151、次に152、などのレコードが永久に追加されます。自動インクリメントIDと外部キー参照の両方として同じフィールドを同時に使用しないでください...

新しいレコードを挿入して一致させる場合は同じものを使用するか@mallid、新しいIDを生成してテーブルに挿入した後、元のレコードCMA_UDS.dbo.Dim_AssetAsset_ID=に更新して、@mallid正しくリンクされるようにする必要があります。どの方法を使用するかは、それらのIDの意味と、特定のアプリケーションにどのような制約があるかによって異なります。

于 2012-08-30T13:02:17.830 に答える