代码改变世界

openquery的一地鸡毛

2010-12-02 12:28  屠龙解牛  阅读(482)  评论(0编辑  收藏  举报

  笔者下的定义:openquery是微软在sqlserver中通过odbc访问其他数据库的一种快捷方式。

  基本格式:openquery(linkservername,'otherDBsqlstring')

  linkeservername 可以在SqlServer中定义,otherDBsqlstring 必须符合异构数据库的语法格式。

  linkserver添加如下:  

    

 

  也可以:EXEC master.dbo.sp_addlinkedserver @server = N'uchome', @srvproduct=N'MYSQL', @provider=N'MSDASQL',

@provstr=N'DRIVER={MySQL ODBC 5.1 Driver};SERVER=yourserver;PORT=yourport;DATABASE=urdb;USER=user;PASSWORD=urpasword;STMT=set names gb2312;OPTION=2563'

这是mysql odbc的设置。OPTION 选项的设置很有意思,是一些素数的和,每个素数代表一个选项,而这个和只能分解成一种结果,以后有机会摸摸这种算法。

笔者在实践中遇到高版本odbc不兼容mysql的char,text类型,会自动截取空格,导致返回长度不一致,网上搜了下有人只好把odbc装回低版本,其实是微软在高版本中默认如此,但是多出来一个设置,改下odbc设置就好了。

      SUID操作

    其他不提,有一点注意。传入linkserver的异构数据库的dml语句必须是字符串,这就导致不能将参数传入,比如sp中就不是很方便。解决的方法有二:

其一:直接在传入之前拼好。比如在C#中将sql拼好,再执行ado.net操作;

其二:在sp中拼sql字符串,再执行。如:

    set @sql ='update openquery([Uchome],''select id,uid,code from uchome_dianpu_relation where uid = '+ cast(@site_uid as varchar)+''') set code ='''+ @code+''''

           exec (@sql)

需要注意,执行exec (@sql)又开了一个新的进程,与sp的进程不同。insert,update 均要如此操作,将where条件放进括号里面,select,delete则无此限制。