我在局域网内有三个服务器  一个是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上同时获取最新的一条数据!!
请高手帮忙!! 谢谢了

解决方案 »

  1.   

    你使用的是SQL 2005吗?
      

  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
    试试看行不行。
      

  3.   

    以前做的东西 用的是SQL 2000 现在需要 增加这么一个功能 请大家帮忙 谢谢了 如何控制 每分钟 执行一次 (除了建立一个作业)还有别的好办法吗?
      

  4.   

    给楼主提供一个思路,仅供参考。
    --首先,在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 ')
      

  5.   

    --首先,在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 ')
      

  6.   

    建立链接服务器,然后就和一台服务器上一样了。插入之前看一下ojbect_id('表名') 如果是null的就select into 否则insert into
      

  7.   

    如果数据是实时要传输的话,用触发器吧。不是实时的话,用job就行。
      

  8.   

    WAITFOR DELAY '00:01:00'
    等待一分鐘