sql server 组下面有两个注册的服务器,一个是本地的,一个是另外一台机的。
我现在想比较这个两个服务器中同数据库名的某个数据表的数据。
比如:server1中有个数据库database1,下面有个表为table1,表中有字段为主键(key)、数量(number)、日期(date)
server2中也有个数据库database1,下面有个表也为table1,表中有字段为主键(key)、数量(number)、日期两个数据库结构和字段全部一模一样,我只是想对比这两个table的数据记录有什么不同(记录数还有同一主键的数量是否一致),请问我该怎么做??(因为有一个数据库是我倒闸过来的数据)
我现在想比较这个两个服务器中同数据库名的某个数据表的数据。
比如:server1中有个数据库database1,下面有个表为table1,表中有字段为主键(key)、数量(number)、日期(date)
server2中也有个数据库database1,下面有个表也为table1,表中有字段为主键(key)、数量(number)、日期两个数据库结构和字段全部一模一样,我只是想对比这两个table的数据记录有什么不同(记录数还有同一主键的数量是否一致),请问我该怎么做??(因为有一个数据库是我倒闸过来的数据)
/******************************************************************************************************************************************************
Tab表:
/*
ID 自增列 Name
----------- ---------
1 a
2 b
3 c
*/
存儲過程:
/*
create proc P
as
select top 10 ID,Name from sysobjects
*/整理人:中國風(Roy)日期:2008.06.06
******************************************************************************************************************************************************/--遠程鏈接服務器機器名:Roy;實例名:Roy\SQL2005DE;登陸名:sa;密碼:Test2005;--創建鏈接服務器
EXEC master.dbo.sp_addlinkedserver @server = N'ROY_LNK', @srvproduct=N'ROY_LNK', @provider=N'SQLOLEDB', @datasrc=N'Roy\SQL2005DE'--SQL05可用SQLNCLI\SQLOLEDB
GO
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'ROY_LNK', @locallogin = NULL , @useself = N'False', @rmtuser = N'sa', @rmtpassword = N'Test2005'
GO--刪除鏈接服務器
--exec sp_dropserver 'roy_lnk','droplogins'--Select
select * from roy_lnk.test.dbo.Tab--insert
insert roy_lnk.test.dbo.Tab(Name)--指定列
Values('d')--update
update roy_lnk.test.dbo.Tab set Name='DD' where Name='d'--delete
delete roy_lnk.test.dbo.Tab where Name='DD'用openrowset:--支持存儲過程
select *from openrowset('SQLOLEDB','Roy\SQL2005DE';'sa';'Test2005','test.dbo.p')a
--select
select *from openrowset('SQLOLEDB','Roy\SQL2005DE';'sa';'Test2005',test.dbo.Tab)a
--insert
insert openrowset('SQLOLEDB','Roy\SQL2005DE';'sa';'Test2005',test.dbo.Tab)(Name)values('EE')--update
update openrowset('SQLOLEDB','Roy\SQL2005DE';'sa';'Test2005',test.dbo.Tab) set Name='EEE' where Name=N'EE'--delete
delete openrowset('SQLOLEDB','Roy\SQL2005DE';'sa';'Test2005',test.dbo.Tab) where Name=N'EEE'
用openquery:--支持存儲過程--支持存儲過程
select * from openquery(roy_lnk, 'test.dbo.P')
--select
SELECT * FROM openquery(roy_lnk, 'SELECT * FROM test.dbo.tab') --insert
insert openquery(roy_lnk, 'SELECT * FROM test.dbo.tab') (Name) values('F')--update
update openquery(roy_lnk, 'SELECT * FROM test.dbo.tab') set Name='FF' where Name='F'--delete不支持是根據 OLE DB 提供者的功能而定
--delete openquery(roy_lnk, 'SELECT * FROM test.dbo.tab') where Name='FF' 用OPENDATASOURCE:--支持存儲過程
select * from OPENDATASOURCE('SQLOLEDB','Data Source=Roy\SQL2005DE;User ID=sa;Password=Test2005').'test.dbo.p' --select
select * from OPENDATASOURCE('SQLOLEDB','Data Source=Roy\SQL2005DE;User ID=sa;Password=Test2005').test.dbo.tab --insert
insert OPENDATASOURCE('SQLOLEDB','Data Source=Roy\SQL2005DE;User ID=sa;Password=Test2005').test.dbo.tab(Name) values('H')--update
update OPENDATASOURCE('SQLOLEDB','Data Source=Roy\SQL2005DE;User ID=sa;Password=Test2005').test.dbo.tab set Name='HH' where Name='H'--delete
delete OPENDATASOURCE('SQLOLEDB','Data Source=Roy\SQL2005DE;User ID=sa;Password=Test2005').test.dbo.tab where Name='HH'
--與本機表數據對比時用別名
select * from roy_lnk.test.dbo.Tab a join tab b on a.ID=b.ID
风才贴出来,你就搬过来了,
吼吼~~
-----------------
PS:
一种方式,如前所说,创建Linked Server.然后查询,
另外一种方式,如果表不多的话,
可以导入到另外一个库的临时表中,直接在一个库中比较即可.
--看数据件数
select count(*) from database1..table1
select count(*) from openrowset('sqloledb','S2IP';'S2userid';'S2psd',select * from database1..table1)
--找不同的数据
select * from database1..table1 t
where exists
( select 1 from opendatasource('sqloledb','data source=S2IP;user id=S2userid;password=S2psd').database1..table1)
where pkey=t.pkey and date=t.date and number<>t.number)
--openrowset与opendatasource性质一样,语法不同/*
S2IP,S2userid,S2psd把这些换了
未测试
如果有语法错误,请参见联机帮助
应该没有问题
*/
sp_addlinkedserver
就把这个语法背下来
set nocount on
exec sp_addlinkedserver 'TestSrv','','SQLOLEDB','172.17.17.17'
exec sp_addlinkedsrvlogin 'TestSrv','false',null,'test','test'
go
select top 10* from TestSrv.account.account.MstNew_FeeContract
/*
--删除连接的服务器
exec sp_dropserver 'TestSrv','droplogins'
*/
set nocount off
参见分布式查询