zoukankan      html  css  js  c++  java
  • [转]mssql链接服务器

    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来交互数据库。。。


    --
  • 相关阅读:
    Unique Binary Search Trees——LeetCode
    Binary Tree Inorder Traversal ——LeetCode
    Maximum Product Subarray——LeetCode
    Remove Linked List Elements——LeetCode
    Maximum Subarray——LeetCode
    Validate Binary Search Tree——LeetCode
    Swap Nodes in Pairs——LeetCode
    Find Minimum in Rotated Sorted Array——LeetCode
    Linked List Cycle——LeetCode
    VR AR MR
  • 原文地址:https://www.cnblogs.com/seerlin/p/2065638.html
Copyright © 2011-2022 走看看