--定时同步服务器上的数据
--例子:
--测试环境,SQL Server2000,远程服务器名:xz,用户名为:sa,无密码,测试数据库:test
--服务器上的表(查询分析器连接到服务器上创建)
create table [user](id int primary key,number varchar(4),name varchar(10))
go
--以下在局域网(本机操作)
--本机的表,state说明:null 表示新增记录,1 表示修改过的记录,0 表示无变化的记录
if exists (select * from dbo.sysobjects where id = object_id(N'[user]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
 drop table [user]
GO
create table [user](id int identity(1,1),number varchar(4),name varchar(10),state bit)
go
--创建触发器,维护state字段的值
create trigger t_state on [user]
after update
as
update [user] set state=1
from [user] a join inserted b on a.id=b.id
where a.state is not null
go--为了方便同步处理,创建链接服务器到要同步的服务器
--这里的远程服务器名为:xz,用户名为:sa,无密码
if exists(select 1 from master..sysservers where srvname='srv_lnk')
 exec sp_dropserver 'srv_lnk','droplogins'
go
exec sp_addlinkedserver  'srv_lnk','','SQLOLEDB','xz'
exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'sa'
go--创建同步处理的存储过程
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_synchro]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
 drop procedure [dbo].[p_synchro]
GO
create proc p_synchro
as
--set  XACT_ABORT on
--启动远程服务器的MSDTC服务
--exec master..xp_cmdshell 'isql /S"xz" /U"sa" /P"" /q"exec master..xp_cmdshell ''net start msdtc'',no_output"',no_output--启动本机的MSDTC服务
--exec master..xp_cmdshell 'net start msdtc',no_output--进行分布事务处理,如果表用标识列做主键,用下面的方法
--BEGIN DISTRIBUTED TRANSACTION
 --同步删除的数据
 delete from srv_lnk.test.dbo.[user]
  where id not in(select id from [user]) --同步新增的数据
 insert into srv_lnk.test.dbo.[user]
 select id,number,name from [user] where state is null
 
 --同步修改的数据
 update srv_lnk.test.dbo.[user] set
  number=b.number,name=b.name
 from srv_lnk.test.dbo.[user] a
  join [user] b on a.id=b.id
 where b.state=1
 
 --同步后更新本机的标志
 update [user] set state=0 where isnull(state,1)=1
--COMMIT TRAN
go--创建作业,定时执行数据同步的存储过程
if exists(SELECT 1 from msdb..sysjobs where name='数据处理')
 EXECUTE msdb.dbo.sp_delete_job @job_name='数据处理'
exec msdb..sp_add_job @job_name='数据处理'--创建作业步骤
declare @sql varchar(800),@dbname varchar(250)
select @sql='exec p_synchro'   --数据处理的命令
 ,@dbname=db_name()   --执行数据处理的数据库名exec msdb..sp_add_jobstep @job_name='数据处理',
 @step_name = '数据同步',
 @subsystem = 'TSQL',
 @database_name=@dbname,
    @command = @sql,
 @retry_attempts = 5,   --重试次数
 @retry_interval = 5    --重试间隔--创建调度
EXEC msdb..sp_add_jobschedule @job_name = '数据处理', 
 @name = '时间安排',
 @freq_type = 4,     --每天
 @freq_interval = 1,    --每天执行一次
 @active_start_time = 00000  --0点执行
go

解决方案 »

  1.   

    “日志备份,备份自上次备份后,数据库所做的改变,在进行日志备份前,也必须有一次完全备份.还原的时候,先还原完全备份,再还原日志备份前,完全备份后的最近一次差异备份(如果有的话),然后再依次还原各次日志备份.”
    我得出结论:日志备份就是增量备份。我的理解对吗?对于日志文件,SQL Server 使用 target_size 以计算整个日志的目标大小;因此,target_size 是收缩操作完成后日志中的可用空间大小。之后,整个日志的目标大小可以解释为每个日志文件的目标大小。DBCC SHRINKFILE 尝试立即将每个物理日志文件收缩至其目标大小。如果虚拟日志中的所有逻辑日志部分都没有超出日志文件的目标大小,该文件将成功截断,DBCC SHRINKFILE 完成且不显示任何消息。然而,如果虚拟日志中的逻辑日志部分超出目标大小,则 SQL Server 释放尽可能多的空间并发出一条消息。该信息告诉您需要执行什么操作来移动文件末尾超出虚拟日志的逻辑日志部分。执行完该操作后,可以重新发出 DBCC SHRINKFILE 命令以释放剩余的空间。有关收缩事务日志的更多信息,请参见收缩事务日志。可以设置数据库自动收缩:
    sp_dboption 'database','autoshrink',true说明你只还原了完全备份,还没有还原日志备份是还原最后一次日志备份前,备份的完成状态均设置为"使数据库不再运行,但能还原其它事务日志"
    还原最后一次日志备份,备份的完成状态设置为"使数据库可以继续运行,这意味着无法还原其它事务日志。"将数据库的故障还原模型设置成简单,然后把属性里“自动收缩”勾上,日志应该就不会异常增长了。
    alter database 库名 set auto_shrink on估计是你的数据库的修改和写的操作很多,而在你重新安装系统之前是将数据的恢复模式设置成的“简单”,现在检查你的数据库的模式,将其修改为“简单”,如果你的系统要求很高,不能设置成“简单”,那么,请检查你的数据库设计,可能存在不合理的地方。
    --生成作业脚本
    sql200企业管理器
    --管理
    --SQL Server代理
    --右键作业
    --所有任务
    --生成SQL脚本
    --输入脚本文件名
    --然后确定,生成一个脚本文件.sql
      

  2.   

    导入导出大全 
    *******  导出到excel
    EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""'/***********  导入Excel
    select * from openrowset('MicroSoft.Jet.OleDB.4.0',
                             'Excel 5.0;HDR=yes;Database=c:\test.xls',sheet1$)
    --------------------------------------------------------
    SELECT * 
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
      'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
    SELECT cast(cast(科目编号 as numeric(10,2)) as nvarchar(255))+' ' 转换后的别名
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
      'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions/** 导入文本文件
    EXEC master..xp_cmdshell 'bcp "dbname..tablename" in c:\DT.txt -c -Sservername -Usa -Ppassword'/** 导出文本文件
    EXEC master..xp_cmdshell 'bcp "dbname..tablename" out c:\DT.txt -c -Sservername -Usa -Ppassword'

    EXEC master..xp_cmdshell 'bcp "Select * from dbname..tablename" queryout c:\DT.txt -c -Sservername -Usa -Ppassword'导出到TXT文本,用逗号分开
    exec master..xp_cmdshell 'bcp "库名..表名" out "d:\tt.txt" -c -t ,-U sa -P password'
    BULK INSERT 库名..表名
    FROM 'c:\test.txt'
    WITH (
        FIELDTERMINATOR = ';',
        ROWTERMINATOR = '\n'
    )
    --/* dBase IV文件
    select * from 
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'dBase IV;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料4.dbf]')
    --*/--/* dBase III文件
    select * from 
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'dBase III;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料3.dbf]')
    --*/--/* FoxPro 数据库
    select * from openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
    'select * from [aa.DBF]')
    --*//**************导入DBF文件****************/
    select * from openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;
    SourceDB=e:\VFP98\data;
    SourceType=DBF',
    'select * from customer where country != "USA" order by country')
    go
    /***************** 导出到DBF ***************/
    如果要导出数据到已经生成结构(即现存的)FOXPRO表中,可以直接用下面的SQL语句insert into openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
    'select * from [aa.DBF]')
    select * from 表说明:
    SourceDB=c:\  指定foxpro表所在的文件夹
    aa.DBF        指定foxpro表的文件名. 
    /*************导出到Access********************/
    insert into openrowset('Microsoft.Jet.OLEDB.4.0', 
       'x:\A.mdb';'admin';'',A表) select * from 数据库名..B表/*************导入Access********************/
    insert into B表 selet * from openrowset('Microsoft.Jet.OLEDB.4.0', 
       'x:\A.mdb';'admin';'',A表) 
     
    Top 
     
     回复人: txlicenhe(马可) ( ) 信誉:167  2003-10-10 18:52:32Z  得分:0  
     
     
      
    *********************  导入 xml 文件DECLARE @idoc int
    DECLARE @doc varchar(1000)
    --sample XML document
    SET @doc ='
    <root>
      <Customer cid= "C1" name="Janine" city="Issaquah">
          <Order oid="O1" date="1/20/1996" amount="3.5" />
          <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied
          </Order>
       </Customer>
       <Customer cid="C2" name="Ursula" city="Oelde" >
          <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue 
                 white red">
                <Urgency>Important</Urgency>
                Happy Customer.
          </Order>
          <Order oid="O4" date="1/20/1996" amount="10000"/>
       </Customer>
    </root>
    '
    -- Create an internal representation of the XML document.
    EXEC sp_xml_preparedocument @idoc OUTPUT, @doc-- Execute a SELECT statement using OPENXML rowset provider.
    SELECT *
    FROM OPENXML (@idoc, '/root/Customer/Order', 1)
          WITH (oid     char(5), 
                amount  float, 
                comment ntext 'text()')
    EXEC sp_xml_removedocument @idoc 
    Top 
     
     回复人: txlicenhe(马可) ( ) 信誉:167  2003-10-10 18:54:30Z  得分:0  
     
     
      
    邹健的
    /********************导整个数据库*********************************************/用bcp实现的存储过程
    /*
    实现数据导入/导出的存储过程
             根据不同的参数,可以实现导入/导出整个数据库/单个表
    调用示例:
    --导出调用示例
    ----导出单个表
    exec file2table 'zj','','','xzkh_sa..地区资料','c:\zj.txt',1
    ----导出整个数据库
    exec file2table 'zj','','','xzkh_sa','C:\docman',1--导入调用示例
    ----导入单个表
    exec file2table 'zj','','','xzkh_sa..地区资料','c:\zj.txt',0
    ----导入整个数据库
    exec file2table 'zj','','','xzkh_sa','C:\docman',0*/
    if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1)
    drop procedure File2Table
    go
    create procedure File2Table
    @servername varchar(200)--服务器名
    ,@username varchar(200)--用户名,如果用NT验证方式,则为空''
    ,@password varchar(200)--密码
    ,@tbname varchar(500)--数据库.dbo.表名,如果不指定:.dbo.表名,则导出数据库的所有用户表
    ,@filename varchar(1000)--导入/导出路径/文件名,如果@tbname参数指明是导出整个数据库,则这个参数是文件存放路径,文件名自动用表名.txt
    ,@isout bit--1为导出,0为导入
    as
    declare @sql varchar(8000)if @tbname like '%.%.%' --如果指定了表名,则直接导出单个表
    begin
    set @sql='bcp '+@tbname
    +case when @isout=1 then ' out ' else ' in ' end
    +' "'+@filename+'" /w'
    +' /S '+@servername
    +case when isnull(@username,'')='' then '' else ' /U '+@username end
    +' /P '+isnull(@password,'')
    exec master..xp_cmdshell @sql
    end
    else
    begin--导出整个数据库,定义游标,取出所有的用户表
    declare @m_tbname varchar(250)
    if right(@filename,1)<>'\' set @filename=@filename+'\'set @m_tbname='declare #tb cursor for select name from '+@tbname+'..sysobjects where xtype=''U'''
    exec(@m_tbname)
    open #tb
    fetch next from #tb into @m_tbname
    while @@fetch_status=0
    begin
    set @sql='bcp '+@tbname+'..'+@m_tbname
    +case when @isout=1 then ' out ' else ' in ' end
    +' "'+@filename+@m_tbname+'.txt " /w'
    +' /S '+@servername
    +case when isnull(@username,'')='' then '' else ' /U '+@username end
    +' /P '+isnull(@password,'')
    exec master..xp_cmdshell @sql
    fetch next from #tb into @m_tbname
    end
    close #tb
    deallocate #tb
    end
    go
      

  3.   

    楼上的大哥们啊,人家肯定是用adox分析元数据,然后生成创建脚本来着~~~~~~~~楼主同志,辛苦了!
      

  4.   

    类型转换如果使用两个 RecordSet 对象的话,应该很顺畅把,转移数据的过程就不要生成具体脚本了吧,无聊的事情让adox去干,你何苦自己干啊。
      

  5.   

    首先、多谢各位的参与!
    各位说的都很不错,使用SQL Server自带的数据导入导出工具功能的确很强大,不过有很多不足之处:
    1、通用性难于保证,比如:数据导出部分,目前我了解到的SQL Server自带工具导出只适合SQL Server导出到其他的数据源,而其他数据库则不能使用SQL Server数据库的工具;
    2、这种操作方式只适合本地数据源的导入导出,想实现远程的很困难;
    3、对于数据的导入导出,目前我知道的一般都是在开发一套带有数据库的应用管理软件,都会开发一套自己的数据导入导出接口,而且支持的功能只有一些表,模式也很简单,而且对数据源的要求很严格,比如字段长度,类型等;
    4、就是对于软件升级时经常能遇到的问题就是:现有的数据库的结构中的一个表,对应老的系统中的多个表,但老系统中这些表是可以建立连接的,这样的一般的数据导入导出时不作处理的;
    5、使用SQL Server这类的管理软件直接导入导出接口,一般都是从一个数据源导出到一个全新的数据源中,在这个过程中建立表结构,而不支持已有的数据结构和分批导入和多次导入;
        好了,这次我就列举这么多吧,一时只想到了这么多,如果有什么新的意见和建议,欢迎大家一起讨论,这样有助于项目的进展,我创建了一个群:7244641,如果大家感兴趣,就可以直接发问。
        对数据处理这块,目前已经做了1年多了,一些问题也发现了不少,自己也想完善一下,但是我每周都有公司的工作,打算开发这个管理系统也是私事,希望大家多多支持。我会尽开拔文档整理出来发个大家。看看我的主体思想是否有问题和缺陷。还有数据库的远程备份问题也应在考虑之内。
      

  6.   

    呵呵,我也想做一个类似的免费软件不过DTS这方面不是我的重点。现在还在需求收集阶段。楼主有空的话,我们可以交流一下。
      

  7.   

    filebat上次和你谈的都放到空间上面去了,简单的整理。