|
sql server200),现在想在其中一个中央服务器上做其他服务器上的数据库数据汇总,想在中央服务器作一个存储过程,用(select..insert)实现,所以涉及到一个跨服务器数据库的数据读取问题,大家有什么好的办法么,写个存储过程的事例可以么。 |
|
|
|
select * into 本地库名..表名 from OPENDATASOURCE( 'SQLOLEDB', 'Data Source=远程ip;User ID=sa;Password=密码' ).库名.dbo.表名 |
|
|
1:建立链接服务器
EXEC sp_addlinkedserver '链接名', '', 'MSDASQL', NULL, NULL, 'DRIVER={SQL Server};SERVER=对方ip;UID=sa;PWD=密码;' (注意是登陆对方服务器的密码) GO 2:授权访问 EXEC sp_addlinkedsrvlogin '链接名','false' 3:访问 insert into 链接名.数据库名..表 select * from 本地表名 |
|
|
insert 本地库名..表名 select * from OPENDATASOURCE(
'SQLOLEDB', 'Data Source=远程ip;User ID=sa;Password=密码' ).库名.dbo.表名 |
|
|
--从效率上考虑,最好创建链接服务器.
exec sp_addlinkedserver 'sl_别名','','SQLOLEDB','远程服务器名' exec sp_addlinkedsrvlogin 'sl_别名','false',null,'sa','密码' go --然后,查询远程服务器上的数据就用: select * from sl_别名.数据库名..表名 |
|
|
1:服务器操作
EXEC sp_addlinkedserver 'Test', --名称 '', 'MSDASQL', NULL, NULL, 'DRIVER={SQL Server};SERVER=服务器名;UID=sa;PWD=密码;' GO -------以上为添加连接服务器 exec sp_addlinkedsrvlogin 'test','false','sa','sa','' 然后就可以 Select * from server1.database1..table1 Select * from server2.database2..table2 |
|
|
谢谢大家,踏网无痕说得很好,邹建兄的建议很有道理,我现在就试试,回头给分。
|
|
|
系统提示错误,包含的前缀数目超过了最大值。最大值为 3
|
|
|
你的语句是怎么写的? 如果写得不正确,就有可能出错.
|
|
|
可以使用opendatasource
或 使用linked server 都可以解决。 |
|
|
--从效率上考虑,最好创建链接服务器.
--exec sp_addlinkedserver 'a','','SQLOLEDB','TXY' --exec sp_addlinkedsrvlogin 'a','false',null,'sa','victor' go --然后,查询远程服务器上的数据就用: SELECT a.scMis.OutStockBillDetail.*,dbo.Product.productname FROM a.scMis.OutStockBillDetail OutStockBillDetail INNER JOIN dbo.Product Product ON a.scMis.OutStockBillDetail.ProductID = dbo.Product.ProductID |
|
|
上面的那个沾错了
|
|
|
--从效率上考虑,最好创建链接服务器.
--exec sp_addlinkedserver 'a','','SQLOLEDB','TXY' --exec sp_addlinkedsrvlogin 'a','false',null,'sa','victor' go --然后,查询远程服务器上的数据就用: --select * from sl_别名.数据库名..表名 SELECT a.scMis.dbo.OutStockBillDetail.*,dbo.Product.productname FROM a.scMis.dbo.OutStockBillDetail OutStockBillDetail INNER JOIN dbo.Product Product ON a.scMis.dbo.OutStockBillDetail.ProductID = dbo.Product.ProductID go 错误提示: 服务器: 消息 117,级别 15,状态 2,行 5 数字 名称 'a.scMis.dbo.OutStockBillDetail' 包含的前缀数目超过了最大值。最大值为 3。 |
|
|
--改为:
SELECT a.*,dbo.Product.productname FROM a.scMis.dbo.OutStockBillDetail a INNER JOIN dbo.Product Product ON a.ProductID = dbo.Product.ProductID |
|
|
呵呵,经过邹建兄的点拨,现在可以实现了,但是,还有有一点不足,就是,怎么样判断把已经存在的链接服务器关闭呢。
|
|
|
怎么没有人回答阿,我等着结单呢
|
|
|
帮你UP!
|
|
select * into 本地库名..表名 from OPENDATASOURCE(
'SQLOLEDB', 'Data Source=远程ip;User ID=sa;Password=密码' ).库名.dbo.表名 insert 本地库名..表名 select * from OPENDATASOURCE( 'SQLOLEDB', 'Data Source=远程ip;User ID=sa;Password=密码' ).库名.dbo.表名 或使用联结服务器: EXEC sp_addlinkedserver '别名','','MSDASQL',NULL,NULL,'DRIVER={SQL Server};SERVER=远程名;UID=用户;PWD=密码;' exec sp_addlinkedsrvlogin @rmtsrvname='别名',@useself='false',@locallogin='sa',@rmtuser='sa',@rmtpassword='密码' GO 然后你就可以如下: select * from 别名.库名.dbo.表名 insert 库名.dbo.表名 select * from 别名.库名.dbo.表名 select * into 库名.dbo.新表名 from 别名.库名.dbo.表名 go |
|
|
一般联结服务器不用删除,如果要的话:
sp_droplinkedsrvlogin @rmtsrvname = '192.168.18.37', @locallogin = 'sa' go sp_dropserver '192.168.18.37' GO 判断: if exists(select 1 from master.dbo.sysservers where srvname='服务名') sp_dropserver '服务名' |
|
|