mssql version:sql server 2008
mysql
version:mysql-5.1.32

1,安装MSDASQL
--安装MSDASQL(64 位 OLEDB Provider for
ODBC
(MSDASQL))
--http://www.microsoft.com/downloads/details.aspx?FamilyID=000364db-5e8b-44a8-b9be-ca44d18b059b&displaylang=zh-cn
--select
the version WindowsServer2003.WindowsXP-KB948459-v2-x64-ENU.exe

2,安装mysql
odbc
--mysql-connector-odbc-5.1.6-winx64.msi

3,外围应用配置器,注册网络
EXEC
sp_configure 'show advanced option',1
RECONFIGURE
go
exec sp_configure
'Ad Hoc Distributed
Queries',1
GO
RECONFIGURE
GO

4,建立MYSQL链接服务器
--用于从mysql获取数据
EXEC
master.dbo.sp_addlinkedserver
@server = N'MYSQL',
@srvproduct=N'MySQL',

@provider=N'MSDASQL',
@provstr=N'DRIVER={MySQL ODBC 5.1 Driver};
SERVER=ip; DATABASE=dbname; USER=username; PASSWORD=password;
OPTION=3'


SELECT * FROM OPENQUERY(MYSQL,'SELECT id,name FROM
test.user');
insert into openquery(MYSQL,'select id,name from test.user where
1=0') values (5,'newUser');

5,建立MSSQL链接服务器
exec sp_addlinkedserver 
'MSSQL', '', 'SQLOLEDB', 'tcp:ip\hostname,1433'
go
exec
sp_addlinkedsrvlogin  'MSSQL', 'false',null, 'username',
'password'
go
select * from openquery(MSSQL,'select id,name from
test.dbo.[user]')
go
==================
2、数据库的访问以及操作

链接数据库建立后,就可以对链接数据库进行访问,普通方法有2种:
(1)T-SQL方式 select * from [链接表名称].[数据库名].[架构].[表名]
ACCESS一般使用: select * from [链接表名称]...[表名] (数据库名和架构都没)
MSSQL 一般使用: select * from [链接表名称].[数据库名].[dbo].[表名]
Oracle 一般使用: 据说是 select * from [链接表名称]..[Oracle用户名].[表名] (我没试成功过。。)
(2)PL/SQL方式 使用OpenQuery交互(虽然不是最好的,但速度比第一种方法至少快一半)
查询实例:
Select * from OpenQuery(连接服务器名称,'Select * from [表名]')
新增实例:
INSERT OPENQUERY (链接服务名称, 'SELECT 字段1,字段2 FROM 表') VALUES ('值1', '值2');
顺便提下:OPENQUERY 会返回一个数据集,换言之上面的语句,必须要等表所有数据都select后才会插入数据,如果数据量大这个过程非常漫长,所以上面的语句需要改进下:
INSERT OPENQUERY (链接服务名称, 'SELECT 字段1,字段2 FROM 表 where 1=2') VALUES ('值1', '值2');
更新实例:
UPDATE OPENQUERY (链接服务名称, 'SELECT 字段1,字段2 FROM 表 WHERE id=1') SET 字段1= '值1', 字段2= '值2';
删除实例:
DELETE OPENQUERY (链接服务名称, 'SELECT 字段1 FROM 表 WHERE 字段1=1');
(以上所有操作实例如果链接的服务器是MSSQL,则需要在表名前添加数据库和架构,如:数据库名.dbo.表名)

另外关于引号的小问题也提下,虽然简单但有时候也容易忽略,比如:
Select * from OpenQuery(连接服务器名称,'Select * from [表名] where id=1') 这样没问题,但如果id是字符那么应该是
Select * from OpenQuery(连接服务器名称,'Select * from [表名] where id=''值''') 需要在一前一后加2个 ' ,如果中间的语句再复杂些,或者引入函数等,需要拆开写,那前后就需要加4个' ,反正原则就是引一次加2个',其实也就是转义。

3、同义词的的使用(仅SQL2005及以上版本支持!)

这个东东很好!很强大! (OPENQUERY其实也就是它的简化版)

创建语句:

CREATE SYNONYM [同义词名称] FOR [链接服务器名称].[数据库].[架构].[表名]
GO

我的个人理解是,首先通过链接服务器创建远程链接,再通过链接服务器创建同义词到本地数据库,这样一来在本地数据库上就相当于创建了虚拟表(支持4种对象的创建:表、视图、函数、存储过程),远程的表就像在本地一样,所以同义词翻译成链接表或者链接对象似乎更为恰当。。

这样一来,操作远程数据库就非常方便了,不管是ACCESS、SQL、还是Oracle(估计其他数据库链接过来也是一样的道理,前提是需要有相应的访问接口)都可以使用最普通的T-SQL语句操作,如:
select * from 同义词名称
insert into 同义词名称(...) values(...)
delete 同义词名称 where...
(当然需要执行增加、删除、修改等操作,需要你相对应的链接服务器有相应的权限)


这样一来前面提到的2种访问链接数据库的方式通通都可以放弃,不过可惜的是如果是SQL2000的话,仍然只能使用OpenQuery来交互数据库。。。


--
posted on 2011-06-01 12:28  Seer Lin  阅读(1139)  评论(0编辑  收藏  举报