我在局域网内有三个服务器 一个是192.168.0.1一个是192.168.0.2 一个是192.168.0.3
在前两个服务器上都是每天自动生成一个表,表名在192.168.0.1上类似d20090311 每天的数据结构都是一样的 然后在192.168.0.2上 类似s20090311 每天的数据也都是一样的 都是每分钟上传一条数据 数据库时间字段为200903110100
我现在想通过存储过程 把192.168.0.1上的其中几个字段 比如:A,B,C,D,E,F 和192.168.0.2上的A1,B1,C1,D1,E1,F1 并且是同一个时间的 存到192.168.0.3 服务器上的当天的一个表中 这个表也要通过存储过程自动生成 表名也要是d20090311 这样的 如果有当天的表就直接插入 如果没有当天的表就自动生成一个 也是每分钟 到0.1上和0.2上同时获取最新的一条数据!!
请高手帮忙!! 谢谢了
在前两个服务器上都是每天自动生成一个表,表名在192.168.0.1上类似d20090311 每天的数据结构都是一样的 然后在192.168.0.2上 类似s20090311 每天的数据也都是一样的 都是每分钟上传一条数据 数据库时间字段为200903110100
我现在想通过存储过程 把192.168.0.1上的其中几个字段 比如:A,B,C,D,E,F 和192.168.0.2上的A1,B1,C1,D1,E1,F1 并且是同一个时间的 存到192.168.0.3 服务器上的当天的一个表中 这个表也要通过存储过程自动生成 表名也要是d20090311 这样的 如果有当天的表就直接插入 如果没有当天的表就自动生成一个 也是每分钟 到0.1上和0.2上同时获取最新的一条数据!!
请高手帮忙!! 谢谢了
create procedure por_test
as
set nocount on
declare @date varchar(20)
set @date=substring(Replace(Replace(Replace(Convert(varchar(19),GetDate(),121),'-',''),':',''),' ',''),1,8)
print @date
declare @sql varchar(8000)
declare @stable varchar(30)
declare @dtable varchar(30)
set @stable='s'+@date
set @dtable='d'+@date
if object_id(@dtable) is not null
begin
set @sql='insert into '+@dtable+' select * from (select * from [192.168.0.1].DB1.dbo.['+@stable+'] where date='+@date
set @sql=@sql+'union all select A1 A,B1 B,C1 C,D1 D,E1 E,F1 F from [192.168.0.2].DB2.dbo.['+@dtable+'] where date='+@date+') T '
set @sql=@sql+'where not exists(select top 0 from '+@dtable+' where A=T.A)'
exec(@sql)
end
else
Begin
set @sql='create table '+@dtable+'(A varchar(50),B varchar(50),C varchar(50),C varchar(50),E varchar(50),F varchar(50))'
exec(@sql)
set @sql='insert into '+@dtable+' select * from (select * from [192.168.0.1].DB1.dbo.['+@stable+'] where date='+@date
set @sql=@sql+'union all select A1 A,B1 B,C1 C,D1 D,E1 E,F1 F from [192.168.0.2].DB2.dbo.['+@dtable+'] where date='+@date+') T '
set @sql=@sql+'where not exists(select top 0 from '+@dtable+' where A=T.A)'
exec(@sql)
End
试试看行不行。
--首先,在192.168.0.3服务器上建2个链接服务器。
1、--创建链接服务器
exec sp_addlinkedserver '192.168.0.1', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
exec sp_addlinkedsrvlogin '192.168.0.1 ', 'false ',null, '用户名 ', '密码 ' exec sp_addlinkedserver '192.168.0.2', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
exec sp_addlinkedsrvlogin '192.168.0.2 ', 'false ',null, '用户名 ', '密码 '
--查询示例
select * from [192.168.0.1].数据库名.dbo.表名 --导入示例
select * into 表 from [192.168.0.1].数据库名.dbo.表名 --以后不再使用时删除链接服务器
exec sp_dropserver '[192.168.0.1] ', 'droplogins '
exec sp_dropserver '[192.168.0.2] ', 'droplogins '
2、启动三台服务器的MSDTC服务
MSDTC服务提供分布式事务服务,如果要在数据库中使用分布式事务,必须在参与的双方服务器启动MSDTC(Distributed Transaction Coordinator)服务。3、打开双方的135端口
MSDTC服务依赖于RPC(Remote Procedure Call (RPC))服务,RPC使用135端口,保证RPC服务启动,如果服务器有防火墙,保证135端口不被防火墙挡住。
使用“telnet IP 135”命令测试对方端口是否对外开放。也可用端口扫描软件(比如Advanced Port Scanner)扫描端口以判断端口是否开放
------------------------------------------------------------------------------------------------------------------------
--在在192.168.0.3服务器上建一个作业。
--SQL SERVER2000为例企业管理器—>数据库服务器—>管理目录—>SQL SERVER代理—>作业—>右键 选—>新建常规选项页—>输入作业名称—>选中所有者。步骤选项页—>新建—>输入步骤名—>类型 TSQL脚本—>选择需要执行的数据库—>在命令框里输入你的SQL 脚本:如:update tb set 状态= ... where 日期...........你可以点左下角的【分析】按钮,分析一下语法,分析无误,按确定。调度选项页—>新建调度—>输入调度名称—>调度类型(可以每分钟执行一次) 你可以选择也可以点右下角的【更改】按钮进行更改,确定。任务栏 SQL SERVER服务器的小图标 双击 服务 选中 SQL SERVER AGENT,点【开始/继续】,选中当启动OS时,自动启动服务,就可以了。到你定的那个时间点,SQL SERVER会自动去执行你的脚本的。
--******************************************************************************************************************
--********************************************************************************************************************--192.168.0.3服务器中的JOB这么写。
declare @sql varchar(8000),@tablename varchar(50)
set @tablename='d'+CONVERT(varchar(12) , getdate(), 112)
--不存在,建表。
set @sql='if not exists(select 1 from sysobjects where name='''+@tablename+''') create table '+@tablename+'(a int,b int,c int,d int) '
exec(@sql)
go
exec('insert '+@tablename+' select top 1 * from [192.168.0.1].dbname.d'+right(@tablename,8)+' order by 时间字段 desc ')
go
exec('insert '+@tablename+' select top 1 * from [192.168.0.2].dbname.s'+right(@tablename,8)+' order by 时间字段 desc ')
1、--创建链接服务器
exec sp_addlinkedserver '192.168.0.1', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
exec sp_addlinkedsrvlogin '192.168.0.1 ', 'false ',null, '用户名 ', '密码 ' exec sp_addlinkedserver '192.168.0.2', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
exec sp_addlinkedsrvlogin '192.168.0.2 ', 'false ',null, '用户名 ', '密码 '
--查询示例
select * from [192.168.0.1].数据库名.dbo.表名 --导入示例
select * into 表 from [192.168.0.1].数据库名.dbo.表名 --以后不再使用时删除链接服务器
exec sp_dropserver '[192.168.0.1] ', 'droplogins '
exec sp_dropserver '[192.168.0.2] ', 'droplogins '
2、启动三台服务器的MSDTC服务
MSDTC服务提供分布式事务服务,如果要在数据库中使用分布式事务,必须在参与的双方服务器启动MSDTC(Distributed Transaction Coordinator)服务。3、打开双方的135端口
MSDTC服务依赖于RPC(Remote Procedure Call (RPC))服务,RPC使用135端口,保证RPC服务启动,如果服务器有防火墙,保证135端口不被防火墙挡住。
使用“telnet IP 135”命令测试对方端口是否对外开放。也可用端口扫描软件(比如Advanced Port Scanner)扫描端口以判断端口是否开放
------------------------------------------------------------------------------------------------------------------------
--在在192.168.0.3服务器上建一个作业。
--SQL SERVER2000为例企业管理器—>数据库服务器—>管理目录—>SQL SERVER代理—>作业—>右键 选—>新建常规选项页—>输入作业名称—>选中所有者。步骤选项页—>新建—>输入步骤名—>类型 TSQL脚本—>选择需要执行的数据库—>在命令框里输入你的SQL 脚本:如:update tb set 状态= ... where 日期...........你可以点左下角的【分析】按钮,分析一下语法,分析无误,按确定。调度选项页—>新建调度—>输入调度名称—>调度类型(可以每分钟执行一次) 你可以选择也可以点右下角的【更改】按钮进行更改,确定。任务栏 SQL SERVER服务器的小图标 双击 服务 选中 SQL SERVER AGENT,点【开始/继续】,选中当启动OS时,自动启动服务,就可以了。到你定的那个时间点,SQL SERVER会自动去执行你的脚本的。
--******************************************************************************************************************
--********************************************************************************************************************--192.168.0.3服务器中的JOB这么写。
declare @sql varchar(8000),@tablename varchar(50)
set @tablename='d'+CONVERT(varchar(12) , getdate(), 112)
--不存在,建表。
set @sql='if not exists(select 1 from sysobjects where name='''+@tablename+''') create table '+@tablename+'(a int,b int,c int,d int) '
exec(@sql)
go
exec('insert '+@tablename+' select top 1 * from [192.168.0.1].dbname.d'+right(@tablename,8)+' order by 时间字段 desc ')
go
exec('insert '+@tablename+' select top 1 * from [192.168.0.2].dbname.s'+right(@tablename,8)+' order by 时间字段 desc ')
等待一分鐘