我是存储过程的新手。我编写了存储过程,将表从一个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
答案 0 :(得分:0)
为什么要在crm_next_id
中插入mall_MallID
作为值,但使用相同的ID与@mallid
进行比较以查看记录是否已插入?例如,如果您有id 5
,并且插入了一个标识为150
的新记录,那么当您再次运行SP时,它不会看到该记录已经插入。接下来运行,它会添加标识为151
的记录,然后152
,依此类推。您不应同时使用相同的字段作为自动增量标识和外键引用...
当您插入新记录以使它们匹配时,或者在生成新ID并插入表格后,您需要使用相同的@mallid
更新原始记录CMA_UDS.dbo.Dim_Asset
以使{ {1}} = Asset_ID
因此它们已正确关联。您使用哪种方法取决于这些ID的含义以及您在特定应用中的约束条件。