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

** 温馨提示:如需转载本文,请注明内容出处。**

本文连接:http://www.cnblogs.com/grom/p/9002943.html

USE [Table]--切换到源表,就是数据最新的那个表
GO
/****** Object: StoredProcedure [dbo].[proc_DataUpdate] Script Date: 2018/5/4 15:08:56 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Grom>
-- Create date: <2018-05-04>
-- Description: <分批更新远程数据,仅支持主键为int表>
-- =============================================
CREATE PROCEDURE [dbo].[proc_DataUpdate]
@TargetInstance nvarchar(max),
@TargetDBName nvarchar(max),
@TargetUID nvarchar(max),
@TargetPWD nvarchar(max),
@LocalDBName nvarchar(max),
@PK_ID nvarchar(max),--主键列(必须为数字)
@Column nvarchar(max),--更新列名集合
@ExecSize int--每次执行数量
AS
declare @sql nvarchar(max),
@NumMax int=0,
@NumMin int=0,
@MaxID int
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
-- SET NOCOUNT ON;--打开注释可不显示执行过程,提高速度

begin try
  --取最大值
  set @sql = 'select @MaxID=MAX('+@PK_ID+') from '+@LocalDBName;
  exec sp_executesql @sql,N'@MaxID int out',@MaxID out
  --循环
  while(@NumMax<@MaxID)
  begin
    if exists (select * from tempdb.dbo.sysobjects where id = object_id(N'tempdb..##tmp_table') and type='U')
    drop table ##tmp_table;

    SET @sql = 'select top '+cast(@ExecSize as nvarchar(1000))+' '+ @Column +' into ##tmp_table from '+@LocalDBName+' where '+@PK_ID+'>'+cast(@NumMax as nvarchar(150));
    exec sp_executesql @sql;

    --记录执行最大值
    SET @SQL='select @NumMax=MAX('+@PK_ID+') from ##tmp_table';
    exec sp_executesql @sql,N'@NumMax int out',@NumMax out;

    --记录执行最小值
    SET @SQL='select @NumMin=MIN('+@PK_ID+') from ##tmp_table';
    exec sp_executesql @sql,N'@NumMin int out',@NumMin out;

    SET @sql='delete openrowset(''SQLOLEDB'','''+@TargetInstance+''';'''+@TargetUID+''';'''+@TargetPWD+''',['+@TargetDBName+'].[dbo].['+@LocalDBName+'])
    where '+@PK_ID+' between '+cast(@NumMin as nvarchar(200))+' and '+cast(@NumMax as nvarchar(200));
    exec sp_executesql @sql;

    SET @sql='insert into openrowset(''SQLOLEDB'','''+@TargetInstance+''';'''+@TargetUID+''';'''+@TargetPWD+''',['+@TargetDBName+'].[dbo].['+@LocalDBName+'])
    ('+@Column+')
    select '+ @Column +' from ##tmp_table'
    exec sp_executesql @sql;

  end

  --删除多余数据
  SET @sql='delete openrowset(''SQLOLEDB'','''+@TargetInstance+''';'''+@TargetUID+''';'''+@TargetPWD+''',['+@TargetDBName+'].[dbo].['+@LocalDBName+'])
  where '+@PK_ID+' >'+cast(@NumMax as nvarchar(200));

  drop table ##tmp_table;
  print 'Success';

end try
begin catch

  select Error_number() as ErrorNumber, --错误代码
  Error_severity() as ErrorSeverity, --错误严重级别,级别小于10 try catch 捕获不到
  Error_state() as ErrorState , --错误状态码
  Error_Procedure() as ErrorProcedure , --出现错误的存储过程或触发器的名称。
  Error_line() as ErrorLine, --发生错误的行号
  Error_message() as ErrorMessage --错误的具体信息
  drop table ##tmp_table;

end catch
END

执行存储过程

USE [table] --源表
GO

DECLARE @return_value int

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 'Return Value' = @return_value

GO

SQL Server 远程更新目标表数据的更多相关文章

  1. 清空SQL Server数据库中所有表数据的方法(转)

    清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入 ...

  2. SQL Server跨库复制表数据错误的解决办法

    SQL Server跨库复制表数据的解决办法   跨库复制表数据,有很多种方法,最常见的是写程序来批量导入数据了,但是这种方法并不是最优方法,今天就用到了一个很犀利的方法,可以完美在 Sql Serv ...

  3. 清空SQL Server数据库中所有表数据的方法

    原文:清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可 ...

  4. oracle 、sql server 、mysql 复制表数据

    我们知道在oracle 中复制表数据的方式是使用 create table table_name as select * from table_name 而在sql server  中是不能这么使用的 ...

  5. sql server truncate table 删除表数据限制条件

    truncate 注释 注释TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快 ...

  6. SQL SERVER 游标循环读取表数据

    [cursor]游标:用于循环表行数据,类似指针 格式如下: declare tempIndex cursor for (select * from table) --定义游标 open tempIn ...

  7. sql server full join拼接表数据,按组加序号

    --查询所有数据select A.*,B.* from(select z.id,z.requestId,z.FBillNo,dt5.FCauseAndProcess,dt5.FEquipmentNo, ...

  8. Sql Server 按行处理表数据思路

    SqlServer的游标当超过1000行左右的时候效率极其低下. DECLARE @Company VARCHAR(12)='' SELECT TOP 1 @Company=CompanyID FRO ...

  9. SQL Server 跨库复制表方法小笔记

    insert into tableA (column1,column2.....) SELECT * FROM OPENDATASOURCE('SQLOLEDB', 'Data Source=127. ...

随机推荐

  1. 学习笔记-JS公开课一

    JS公开课笔记 没特别说明就是和Java语言一样. JS变量:弱类型语言 1.在JS中,true表示1,false表示0.和Java不一样. 2. var y: 提示undefined: 3.如果al ...

  2. 【Unity Shaders】Transparency —— 透明的cutoff shader

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  3. HMM:隐马尔科夫模型-维特比算法

    http://blog.csdn.net/pipisorry/article/details/50731584 目标-解决HMM的基本问题之二:给定观察序列O=O1,O2,-OT以及模型λ,如何选择一 ...

  4. Java-IO之ByteArrayInputStream

    ByteArrayInputStream是字节数组输入流,继承于InputStream.它包含了一个内部缓冲区,该缓冲区包含从流中读取的字节,其实内部缓冲区就是一个字节数组,而ByteArrayInp ...

  5. hive中与hbase外部表join时内存溢出(hive处理mapjoin的优化器机制)

    与hbase外部表(wizad_mdm_main)进行join出现问题: CREATE TABLE wizad_mdm_dev_lmj_edition_result as select *  from ...

  6. 【Android 应用开发】 Application 使用分析

    博客地址 : http://blog.csdn.net/shulianghan/article/details/40737419 代码下载 : Android 应用 Application 经典用法; ...

  7. Android源码浅析(三)——Android AOSP 5.1.1源码的同步sync和编译make,搭建Samba服务器进行更便捷的烧录刷机

    Android源码浅析(三)--Android AOSP 5.1.1源码的同步sync和编译make,搭建Samba服务器进行更便捷的烧录刷机 最近比较忙,而且又要维护自己的博客,视频和公众号,也就没 ...

  8. Linux编译Windows共享目录下代码

    Linux编译Windows共享目录下代码(金庆的专栏)万神服务器代码是跨平台的.平时策划在Windows上开自己的服务器测试,测试和发布服务器为Linux.开发时,先在Windows上编译测试,再到 ...

  9. Java进阶(二十四)Java List集合add与set方法原理简介

    Java List集合add与set方法原理简介 add方法 add方法用于向集合列表中添加对象. 语法1 用于在列表的尾部插入指定元素.如果List集合对象由于调用add方法而发生更改,则返回 tr ...

  10. javascript语法之循环语句

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...