SQL Server 远程更新目标表数据的存储过程
本文给大家分享一个远程更新目标库数据的存储过程,适用于更新列名一致,主键为Int类型,可远程链接的数据库。
USE[Table]--切换到源表,就是数据最新的那个表 GO /******Object:StoredProcedure[dbo].[proc_DataUpdate]ScriptDate:2018/5/415:08:56******/ SETANSI_NULLSON GO SETQUOTED_IDENTIFIERON GO --============================================= --Author:--Createdate:<2018-05-04> --Description:<分批更新远程数据,仅支持主键为int表> --============================================= CREATEPROCEDURE[dbo].[proc_DataUpdate] @TargetInstancenvarchar(max), @TargetDBNamenvarchar(max), @TargetUIDnvarchar(max), @TargetPWDnvarchar(max), @LocalDBNamenvarchar(max), @PK_IDnvarchar(max),--主键列(必须为数字) @Columnnvarchar(max),--更新列名集合 @ExecSizeint--每次执行数量 AS declare@sqlnvarchar(max), @NumMaxint=0, @NumMinint=0, @MaxIDint BEGIN --SETNOCOUNTONaddedtopreventextraresultsetsfrom --interferingwithSELECTstatements. --SETNOCOUNTON;--打开注释可不显示执行过程,提高速度 begintry --取最大值 set@sql='select@MaxID=MAX('+@PK_ID+')from'+@LocalDBName; execsp_executesql@sql,N'@MaxIDintout',@MaxIDout --循环 while(@NumMax<@MaxID) begin ifexists(select*fromtempdb.dbo.sysobjectswhereid=object_id(N'tempdb..##tmp_table')andtype='U') droptable##tmp_table; SET@sql='selecttop'+cast(@ExecSizeasnvarchar(1000))+''+@Column+'into##tmp_tablefrom'+@LocalDBName+'where'+@PK_ID+'>'+cast(@NumMaxasnvarchar(150)); execsp_executesql@sql; --记录执行最大值 SET@SQL='select@NumMax=MAX('+@PK_ID+')from##tmp_table'; execsp_executesql@sql,N'@NumMaxintout',@NumMaxout; --记录执行最小值 SET@SQL='select@NumMin=MIN('+@PK_ID+')from##tmp_table'; execsp_executesql@sql,N'@NumMinintout',@NumMinout; SET@sql='deleteopenrowset(''SQLOLEDB'','''+@TargetInstance+''';'''+@TargetUID+''';'''+@TargetPWD+''',['+@TargetDBName+'].[dbo].['+@LocalDBName+']) where'+@PK_ID+'between'+cast(@NumMinasnvarchar(200))+'and'+cast(@NumMaxasnvarchar(200)); execsp_executesql@sql; SET@sql='insertintoopenrowset(''SQLOLEDB'','''+@TargetInstance+''';'''+@TargetUID+''';'''+@TargetPWD+''',['+@TargetDBName+'].[dbo].['+@LocalDBName+']) ('+@Column+') select'+@Column+'from##tmp_table' execsp_executesql@sql; end --删除多余数据 SET@sql='deleteopenrowset(''SQLOLEDB'','''+@TargetInstance+''';'''+@TargetUID+''';'''+@TargetPWD+''',['+@TargetDBName+'].[dbo].['+@LocalDBName+']) where'+@PK_ID+'>'+cast(@NumMaxasnvarchar(200)); droptable##tmp_table; print'Success'; endtry begincatch selectError_number()asErrorNumber,--错误代码 Error_severity()asErrorSeverity,--错误严重级别,级别小于10trycatch捕获不到 Error_state()asErrorState,--错误状态码 Error_Procedure()asErrorProcedure,--出现错误的存储过程或触发器的名称。 Error_line()asErrorLine,--发生错误的行号 Error_message()asErrorMessage--错误的具体信息 droptable##tmp_table; endcatch END
执行存储过程
USE[table]--源表 GO DECLARE@return_valueint EXEC@return_value=[dbo].[proc_DataUpdate] @TargetInstance=N'',--远程数据库实例如目标库不在一个域,切勿使用内网地址 @TargetDBName=N'',--远程数据库名称 @TargetUID=N'',--用户名 @TargetPWD=N'',--密码 @LocalDBName=N'',--用于更新表名(源表) @PK_ID=N'',--主键列(必须为Int) @Column='ID,Name',--更新列名集合例'A,B,C' @ExecSize=200--每次执行条数 SELECT'ReturnValue'=@return_value GO
总结
以上所述是小编给大家介绍的SQLServer远程更新目标表数据的存储过程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!