即 比如有两家店,都各自有一台电脑,都装了数据库SQL2000
分店数据库的数据上传到总店的数据库.如何上传?(只要分店数据上传,总店数据库只是用来查询而已)我做的是C/S的系统,由于两家店的距离比较长,所以想用定时传输或者自己手动传输有例子的话最好
分店数据库的数据上传到总店的数据库.如何上传?(只要分店数据上传,总店数据库只是用来查询而已)我做的是C/S的系统,由于两家店的距离比较长,所以想用定时传输或者自己手动传输有例子的话最好
--参考:
/*
作者:邹建
*/ /*--同步两个数据库的示例 有数据
srv1.库名..author有字段:id,name,phone,
srv2.库名..author有字段:id,name,telphone,adress 要求:
srv1.库名..author增加记录则srv1.库名..author记录增加
srv1.库名..author的phone字段更新,则srv1.库名..author对应字段telphone更新
--*/ --大致的处理步骤
--1.在 srv1 上创建连接服务器,以便在 srv1 中操作 srv2,实现同步
exec sp_addlinkedserver 'srv2','','SQLOLEDB','srv2的sql实例名或ip'
exec sp_addlinkedsrvlogin 'srv2','false',null,'用户名','密码'
go --2.在 srv1 和 srv2 这两台电脑中,启动 msdtc(分布式事务处理服务),并且设置为自动启动
我的电脑--控制面板--管理工具--服务--右键 Distributed Transaction Coordinator--属性--启动--并将启动类型设置为自动启动
go
--然后创建一个作业定时调用上面的同步处理存储过程就行了 企业管理器
--管理
--SQL Server代理
--右键作业
--新建作业
--"常规"项中输入作业名称
--"步骤"项
--新建
--"步骤名"中输入步骤名
--"类型"中选择"Transact-SQL 脚本(TSQL)"
--"数据库"选择执行命令的数据库
--"命令"中输入要执行的语句: exec p_process
--确定
--"调度"项
--新建调度
--"名称"中输入调度名称
--"调度类型"中选择你的作业执行安排
--如果选择"反复出现"
--点"更改"来设置你的时间安排
然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行 设置方法:
我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.
--3.实现同步处理的方法2,定时同步 --在srv1中创建如下的同步处理存储过程
create proc p_process
as
--更新修改过的数据
update b set name=i.name,telphone=i.telphone
from srv2.库名.dbo.author b,author i
where b.id=i.id and
(b.name <>i.name or b.telphone <>i.telphone) --插入新增的数据
insert srv2.库名.dbo.author(id,name,telphone)
select id,name,telphone from author i
where not exists(
select * from srv2.库名.dbo.author where id=i.id) --删除已经删除的数据(如果需要的话)
delete b
from srv2.库名.dbo.author b
where not exists(
select * from author where id=b.id)
go
操作:1)在北京机房服务器建存储过程,每天生成一个新表。
CREATE PROCEDURE [dbo].[VMMList_creatbyday]
AS
BEGIN
DECLARE @TableName varchar(64)
set @TableName = 'VMMList_'+REPLACE(Convert(varchar(10),DATEADD(day, -1, getdate()),20),'-','')
print(@TableName)
exec('select * into '+@TableName+' from dbo.VMMList_20090826 where 1<>1')
END
2):建立作业,每天凌晨0点调用这个存储过程。
exec VMMList_creatbyday
3):在线上数据库中exchange上建存储过程,往北京机房服务器发送数据。
USE [exchange]
GO
/****** 对象: StoredProcedure [dbo].[VMMList_sendbyday] 脚本日期: 08/26/2009 11:33:04 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[VMMList_sendbyday]
AS
BEGIN
DECLARE @TableName varchar(64)
set @TableName = 'VMMList_'+REPLACE(Convert(varchar(10),DATEADD(day, -1, getdate()),20),'-','')
--print(@TableName)
declare @sql nvarchar(1000)
set @sql='insert into OPENDATASOURCE(''SQLOLEDB'', ''Data Source=’IP地址‘;User ID=用户名;Password=密码'').qyyx.dbo.['+ @TableName+'] select * from [exchange].dbo.[VMMList]'
exec (@sql)
END
4):建立作业,每天凌晨0点10分调用存储过程。
exec vSmsList_sendbyday
5)今天上午经检查实现了三个表的自己传输,添补修正1-9号的SQL如下。现在vsmslist执行时总是提示:消息8152,级别16,状态10,第1 行
将截断字符串或二进制数据。语句已终止。问题尚未解决。
select count(*) from SYMails_20090826
insert into VMMList_20090826 select * from VMMList_20090709 where insdate<'2009-08-26 00:00:00.000'
6):解决作业不能自动执行的BUG,经查是因建立作业的操作员权限不足。
7):解决二进制报错bug,加了一个连接限制,当每日变更数据不超过1000条就不会报错,目前每天变更数据为0-15条,但是没有问题,日后当用户大批量导入时,可通过脚本手动执行。
8:修正了以前的数据,原来局方工作人员想要ECEntUser企业用户信息表每天传所有的,其他三个表传当天的数据,加了日期的限制,脚本如下:
set @sql='insert into OPENDATASOURCE(''SQLOLEDB'', ''Data Source=IP地址,端口号;User ID=用户名;Password=密码'').qyyx.qyyx.['+ @TableName+']
select * from [exchange].dbo.[symails] where convert(varchar(10),msgdate,120)=Convert(varchar(10),DATEADD(day, -3, getdate()),20)'
exec (@sql)
如果没有专线的话,那就传递数据文件吧,在分店先导出到txt文件,然后在服务器导入