问题是这样的:我有两台服务器,ServA和ServB,这两台服务器中都安装有Sqlserver2000,Sqlserver2000都有同样名称的数据库CommData,CommData数据库中有数据表CommTable。 ServB中的数据库会经常进行一些更新,我想做的是:不定期从ServB中CommTable中检查有不存在于ServA中CommTable表中的记录出来,然后将之插入到ServA中的CommTable表中。 请问这样该怎样实现啊。
调试欢乐多
这样省得两台服务器之间去比较
下面的是我想表达的是从ServA中的CommData数据库中的CommTable表中检索出不在ServB中的CommData数据库中的CommTable表的记录出来。
Select * from ServA.CommData.CommTable where 条件1 and recordid not id (select recordid from ServB.CommData.CommTable 上面的语句是我想写的SQL语句,但是我不清楚该怎样写出完整、正确的SQL语句出来。
首先在ServA上添加一个指向ServB的链接服务器(关于sql server 的链接服务器怎么设置请另外搜索资料)
加入你建立的链接服务器的名称是ServB_link那么你在ServA上执行如下的语句就可以了insert into CommTable
Select * from ServB_link.CommData.CommTable
where 条件1 and recordid not id (select recordid from CommTable )
这是一个在局域网运行的C/S程序,但后面增加了需求,要把程序离线到笔记本带来外面使用,他们的做法是,在笔记本上安装了Sqlserver数据库,每次使用时,将服务器ServA上的数据库CommData内容备份还原到笔记本中的数据库服务器中。使用完后再将笔记本中更新的数据添加到ServA中的CommData数据库中。
但是他们的做法非常麻烦,首先将笔记本数据库的内容备份后拷贝到ServA上,然后再在ServA中新建一个临时数据库TempCommData,将备份内容还原到TempCommData中,最后才是写的一段小程序将TempCommData中的更新检索出来添加到ServA中的CommData数据库中。
我认为这样非常麻烦,因为备份出来的数据库内容有点大,有好几个G的内容,这样倒入倒入太费时间了,我术想直接将笔记本接入交换机上,在笔记本上写这样的一段小程序,直接将笔记本更新过的内容检索出来后添加到ServA中的CommData数据库中去。 因此这样就出现了不会写下面这种SQL语句的情况:
Select * from ServA.CommData.CommTable where 条件1 and recordid not id (select recordid from ServB.CommData.CommTable ) 我想请问的是这种SQL语句该怎样写?????
Select * from CommTable where 条件1 and recordid not in (select recordid from OPENDATASOURCE('sqloledb','data source=ServB;user id=SA;password=12345').CommData.dbo.CommTable 以上就可以从笔记本数据库中检索出不在服务器ServA中数据库的记录来????
//user sql link (sql insert\update\delete...)
select * from openquery(svr_iqcjl,'select * from mdr')
/****** Object: LinkedServer [svr_iqcjl] Script Date: 02/05/2009 20:58:35 ******/
EXEC master.dbo.sp_addlinkedserver @server = N'svr_iqcjl', @provider=N'SQLOLEDB', @datasrc=N'172.20.100.12'
/* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'svr_iqcjl',@useself=N'False',@locallogin=NULL,@rmtuser=N'IQC',@rmtpassword='########'GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'collation compatible', @optvalue=N'false'
GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'data access', @optvalue=N'true'
GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'dist', @optvalue=N'false'
GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'pub', @optvalue=N'false'
GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'rpc', @optvalue=N'false'
GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'rpc out', @optvalue=N'false'
GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'sub', @optvalue=N'false'
GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'connect timeout', @optvalue=N'0'
GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'collation name', @optvalue=null
GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'lazy schema validation', @optvalue=N'false'
GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'query timeout', @optvalue=N'0'
GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'use remote collation', @optvalue=N'true'
GO
我也被SQL语句困惑了,不知道两个表中的数据对比应该怎么写!~
10.225.254.1:远程计算机的IP地址。
刚才认真去看了这个链接提供的资料,收获不小,这也证明我上面的方法是可行的。
下面干脆我将这个资料全部拷贝过来让大家看看。不同服务器数据库之间的数据操作--创建链接服务器
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 ' --查询示例
select * from ITSV.数据库名.dbo.表名 --导入示例
select * into 表 from ITSV.数据库名.dbo.表名 --以后不再使用时删除链接服务器
exec sp_dropserver 'ITSV ', 'droplogins ' --连接远程/局域网数据(openrowset/openquery/opendatasource)
--1、openrowset --查询示例
select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) --生成本地表
select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) --把本地表导入远程表
insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
select *from 本地表 --更新本地表
update b
set b.列A=a.列A
from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b
on a.column1=b.column1 --openquery用法需要创建一个连接 --首先创建一个连接创建链接服务器
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
--查询
select *
FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
--把本地表导入远程表
insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
select * from 本地表
--更新本地表
update b
set b.列B=a.列B
FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') as a
inner join 本地表 b on a.列A=b.列A --3、opendatasource/openrowset
SELECT *
FROM opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta
--把本地表导入远程表
insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名
select * from
2,其实你的问题就是两台服务器的数据同步问题,只要在一个服务器上创建一个包,然后建一个作业定时去调度。非常的方便,好用。这种方法是数据库数据同步的常规、合理做法。