分享一个远程更新目标库数据的存储过程

  本文给大家分享一个远程更新目标库数据的存储过程,适用于更新列名一致,主键为Int类型,可远程链接的数据库。
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(http://www.0831jlyy.com)
-- =============================================
-- 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(http://jlyy0831.com)
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
-- SET NOCOUNT ON;--打开注释可不显示执行过程,提高速度
begin try
  --取最大值
  set @sql = ‘select @MaxID=MAX(‘[email protected]_ID+‘) from ‘[email protected];
  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 ‘[email protected]+‘ where ‘[email protected]_ID+‘>‘+cast(@NumMax as nvarchar(150));
    exec sp_executesql @sql;
    --记录执行最大值
    SET @SQL=‘select @NumMax=MAX(‘[email protected]_ID+‘) from ##tmp_table‘;
    exec sp_executesql @sql,N‘@NumMax int out‘,@NumMax out;
    --记录执行最小值
    SET @SQL=‘select @NumMin=MIN(‘[email protected]_ID+‘) from ##tmp_table‘;
    exec sp_executesql @sql,N‘@NumMin int out‘,@NumMin out;
    SET @sql=‘delete openrowset(‘‘SQLOLEDB‘‘,‘‘‘[email protected]+‘‘‘;‘‘‘[email protected]+‘‘‘;‘‘‘[email protected]+‘‘‘,[‘[email protected]+‘].[dbo].[‘[email protected]+‘])
    where ‘[email protected]_ID+‘ between ‘+cast(@NumMin as nvarchar(200))+‘ and ‘+cast(@NumMax as nvarchar(200));
    exec sp_executesql @sql;
    SET @sql=‘insert into openrowset(‘‘SQLOLEDB‘‘,‘‘‘[email protected]+‘‘‘;‘‘‘[email protected]+‘‘‘;‘‘‘[email protected]+‘‘‘,[‘[email protected]+‘].[dbo].[‘[email protected]+‘])
    (‘[email protected]+‘)
    select ‘+ @Column +‘ from ##tmp_table‘
    exec sp_executesql @sql;
  end
  --删除多余数据
  SET @sql=‘delete openrowset(‘‘SQLOLEDB‘‘,‘‘‘[email protected]+‘‘‘;‘‘‘[email protected]+‘‘‘;‘‘‘[email protected]+‘‘‘,[‘[email protected]+‘].[dbo].[‘[email protected]+‘])
  where ‘[email protected]_ID+‘ >‘+cast(@NumMax as nvarchar(200));
  drop table ##tmp_table;
  print ‘Success‘;
end try(http://www.0834xcjl.com)
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 远程更新目标表数据的存储过程,希望对大家有所帮助。

原文地址:https://www.cnblogs.com/HanaKana/p/12005169.html

时间: 2024-08-03 16:01:06

分享一个远程更新目标库数据的存储过程的相关文章

分享一个嵌入式httpdserver开发库 - boahttpd library

http://sourceforge.net/projects/boahttpd/ 一个C接口的开发库,适用于 windows/linux/或其它嵌入式平台,支持CGI扩展,支持多线程.採用面向对象开发,一个应用里能够同一时候开多个http server,仅仅要port不同就互不影响.主要应用场景应该是嵌入式应用(所谓boa-server的概念),在须要做一个基本web的设备管理使用.在样例中就是展示,从页面信息的提交.到处理.到结果的返回,里面结合jquery/bootstrap网页技术,能够

分享一个Delphi跨平台Http库的封装,一个Delphi跨平台TCP库的封装

{ 单元名:跨平台的TCP客户端库封装 作者:5bug 网站:http://www.5bug.wang } unit uCPTcpClient; interface uses System.Classes, System.SysUtils, IdTCPClient, IdGlobal; type TOnRevDataEvent = procedure(const pData: Pointer; const pSize: Cardinal) of object; TCPTcpClient = cl

分享一个大型进销存供应链项目(多层架构、分布式WCF多服务器部署、微软企业库架构)

分享一个大型进销存供应链项目(多层架构.分布式WCF多服务器部署.微软企业库架构) 这是一个比较大型的项目,准备开源了.支持N家门店同时操作.远程WCF+企业库5.0实现. 这块应该算是库存模块中的核心模块了,因为该块的业务逻辑比较多,比较繁琐,大致讲讲业务逻辑吧,大致的逻辑为:出库单/出库单-->填写订单-->出库/入库-->修改库存信息,按照这个顺序来完成入库出库,顺序不能颠倒,同时还要实现订单的删除,修改,在修改库存信息时由于表和表之间有很多的外键关系,所以要同时删除多张表中含有删

pt-archiver归档数据 源库和目标库是否会出现不一致

背景 归档的表在源库和目标库都要存在 pt-archiver归档表的场景有:不删原表数据,非批量插入目标库:不删原表数据,批量插入目标库:非批量删除原表数据,非批量插入目标库:批量删除原表数据,批量插入目标库 版本 pt-archiver --version pt-archiver 3.0.12 select @@version; +-----------+ | @@version | +-----------+ | 8.0.12 | +-----------+ 是否会出现不一致情况 源库已经d

分享一个嵌入式httpd服务器开发库 - boahttpd library

http://sourceforge.net/projects/boahttpd/ 一个C接口的开发库,适用于 windows/linux/或其他嵌入式平台,支持CGI扩展,支持多线程.采用面向对象开发,一个应用里可以同时开多个http server,只要端口不同就互不影响. 目前只写了英文帮助,大家凑合看吧. boahttpd Library Development Manual Last Modified: 2014-07-08 1.     Introduction The library

Replicate_Do_DB 参数发现跨库操作时从库数据不更新

问题:使用复制是设置  Replicate_Do_DB 参数发现跨库操作时从库数据不更新 1 设置从库的 replicate_do_db = test 2 主库的sql语句是跨库的insert    在test7 上插入数据到test.a 的表上. use test7; 3 主库数据更新后查看从库信息发现数据并没有插入 4 原因是mysql 在执行sql前检查的当前默认库,所以跨库的sql语句不会被执行. 解决方案: 1 使用参数   replicate-wild-ignore-table =t

分享一个简单易用的软件定时器模块——基于keil+stm32f103zet+hal库(裸机实现)

公众号上看到一个比较好的一个github项目:https://github.com/0x1abin/MultiTimer 今天看了看,简单的,就移植了- 且看文档的说明, ================================= 分享一个简单易用的软件定时器模块——MultiTimer.源码地址: https://github.com/0x1abin/MultiTimer 简介 MultiTimer 是一个软件定时器扩展模块,可无限扩展你所需的定时器任务,取代传统的标志位判断方式, 更

SDS(Simple Dynamic String)一个简易动态字符串库

SDS(Simple Dynamic Strings)是一个C语言字符串库,设计中增加了从堆上分配内存的字符串,来扩充有限的libc字符处理的功能,使得: 使用更简便 二进制安全 计算更有效率 而且仍旧…兼容一般的C字符串功能 它使用另一种设计来实现,不用C结构体来表现一个字符串,而是使用一个二进制的前缀(prefix),保存在实际的指向字符串的指针之前,SDS将其返回给用户. C 1 2 3 4 5 +--------+-------------------------------+-----

[生产库实战] 采用存储过程对生产线历史表数据进行归档

生产线历史数据归档是数据库运维的一项日常基本工作.在建表设计时,通常都将数据流水表(如:日志.用户登录历史,软件下载记录,用户属性更改历史表等)设计为范围分区表.间隔分区表(11G),当超过业务要求的保留范围时,此数据基本是静态数据且应用程序再不对其进行访问,但有可能会由于某些特殊要求需要手动查询.在这个情况下,都将其数据从生产库归档至历史库,并对其进行压缩保存,如果超出特殊要求查询的范围,那就直接将其导出压缩备份到磁带. 在Oracle数据库中,用做表数据归档操作的方法很多,如:exp/imp