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则无此限制。