在SQL Server中连接其他数据库的尝试

为了完成远程数据同步,必须让偶的CostModel库和远程别的SQL Server或者Access文件进行一些数据操作。而且,这个操作必须在client端完成,因为client段希望能将这个SQL脚本通过osql来订制到系统计划任务里执行,达到定期同步数据的效果。

因此,我今天做了些试验,就是如何在本地SQL Server中通过SQL连接操作Access文件和另一个SQL Server数据库。为了搭建试验环境,我还给我的机器又启了一个SQL Server实例,启动新的SQL Server实例很简单,就是把SQL Server安装盘找来重装一遍,安装过程中就会提示你输入新实例的名字,不过,中间出现了一点小插曲,就是报这个错误:

 A previous program installation created pending file operations
on the installation machine. You must restart the computer before
running setup.

貌似什么上次安装不完全导致的,其实解决起来很简单,进注册表,找到 HKEYLOCALMACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\pendingfilerenameoperations 这个键值,把它删掉就好了。天知道怎么导致的,也许是SQL Server的安装程序做的不好吧:P

言归正传,还是说怎么通过SQL操作其他数据库吧。开始在帮助文档里搜索distributed query,结果看到了一个存储过程spaddlinkedserver,就猜想先要用这个存储过程注册一个远程数据库来着。结果试验来试验去,执行这个存储过程倒是成功的把一个Access文件和另一个SQL Server实例都加到了什么linked server,但再往下一步看如何用SQL查数据时,发现有没有用这个spaddlinkedserver都无所谓,因为可以SQL中可以直接用opendatasource或openrowset来打开远程数据源或数据集操作的,而且今天去见mentor,mentor说还可以直接用SQL Server的replication来做的说,不过这个我打算先用opendatasource/openrowset搞定了再看看replication相关的文档。

SQL Server提供的文档其实不够详细,openrowset打开Access文件遇到一点小问题,用这个语句去打开时:

select * from openrowset(‘Microsoft.Jet.OLEDB.4.0’, ‘d:\emptydb.mdb’, [ATC Staff])

报什么7399错误,这个SQL Server帮助倒有得解释,说一个没有security的Access文件要用用户名为’Admin’,密码为空的去打开,然后就有一个比较怪的用法:

select * from openrowset(‘Microsoft.Jet.OLEDB.4.0’, ‘d:\emptydb.mdb’;’Admin’;”, [ATC Staff])

用’;’分割开用户名和密码去打开,但是明显这个不是一个合法的字符串嘛,怪怪的用法。

用opendatasource去打开我机器上另一个SQL Server实例时,按照SQL Server附带文档写的一个方法去打开还是报7399错误,晕,文档里关于7399错误的描述只有针对打开Access的。好在有google,才发现用opendatasource去打开其他数据源,其用法和在ADO.NET中竟然完全一致,估计是直接将这个串传入底层dll去做的吧,用法如下:

select * from opendatasource(‘SQLOLEDB’, ‘Data Source=localhost;Initial Catalog=CostModel;Integrated Security=SSPI;’).CostModel.dbo.t_StaffDelta

中间那个指明datasource的串,和我用ADO.NET的连接串一模一样。在windows域内用window集成验证还就是挺方便的,hehe,省却用户名密码啦。

好,接着试验吧,远程同步,两台数据库的数据都有操作,我应该把要做的动作分析一下,把两端分别要做的事情列出来先~~

wingc

Read more posts by this author.