这篇文章主要介绍SQL Server如何远程更新目标表数据的存储过程,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

远程更新目标库数据的存储过程,适用于更新列名一致,主键为Int类型,可远程链接的数据库。

USE[Table]--切换到源表,就是数据最新的那个表GO/******Object:StoredProcedure[dbo].[proc_DataUpdate]ScriptDate:2018/5/415:08:56******/SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGO--=============================================--Author:<Grom>--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--每次执行数量ASdeclare@sqlnvarchar(max),@NumMaxint=0,@NumMinint=0,@MaxIDintBEGIN--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';endtrybegincatch  selectError_number()asErrorNumber,--错误代码  Error_severity()asErrorSeverity,--错误严重级别,级别小于10trycatch捕获不到  Error_state()asErrorState,--错误状态码  Error_Procedure()asErrorProcedure,--出现错误的存储过程或触发器的名称。  Error_line()asErrorLine,--发生错误的行号  Error_message()asErrorMessage--错误的具体信息  droptable##tmp_table;endcatchEND

执行存储过程

USE[table]--源表GODECLARE@return_valueintEXEC@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_valueGO

以上是“SQL Server如何远程更新目标表数据的存储过程”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!