使用链接服务器和 ODBC "Requested conversion is not supported"



我们的web应用程序将UTF-8编码的数据存储在VARCHAR字段中。最近,我们使用DataDirect的OpenAccess ODBC驱动程序通过ODBC为客户提供了对这些数据的访问。这是使用DataDirect的OpenAccess SDK实现的,它编写了一个C#.Net类来与服务接口。我们只允许客户执行SELECT查询。此时,我们还将结果限制为100K行。

这个解决方案确实很有效,除了用一些编码数据查询字段对用户来说是胡言乱语,这是可以理解的。在我们服务的下一个版本中,我希望为用户提供使用未编码字符串进行查询的能力,然后查看未编码的结果。

我通过UTF-8对传入查询进行编码,然后通过标记VARCHAR字段为WVARCHAR来返回未编码的结果,从而解决了这个问题。这实际上非常有效。不过,这确实意味着,尽管存在(或缺少)Unicode字符,但每个VARCHAR列都会返回为WVARCHAR。

目前,我们的许多客户都采用了在他们自己的SQL server实例上的SSMS中创建链接服务器的方法,这是我首选的连接方法。由于我们的服务将结果限制在10万行,我鼓励每个人使用OPENQUERY来执行查询。不过,我在SSMS中的链接服务器的配置中似乎缺少一些东西。当对这些WVARCHAR列执行字符串函数(例如LEFT、RIGHT、SUBSTRING)时,SSMS返回以下错误:

链接服务器"LOCAL"的OLE DB访问接口"MSDASQL"返回消息"不支持请求的转换。"。Msg 7341,级别16,状态2,第1行无法获取列"[MSDASQL].ColName"的当前行值来自链接服务器"LOCAL"的OLE DB访问接口"MSDASQL"。

对于这样的查询,将返回此信息:

SELECT *
FROM OPENQUERY([LOCAL], '
  SELECT LEFT(FirstName, 2) AS ColName
  FROM dbo.User 
')

如果我从这个查询中删除LEFT函数,那么FirstName列将被返回,并正确解码,不会出现错误。

这个问题不会影响例如MS Excel中的查询。从表面上看,当我调试与DataDirect产品接口的.Net类时,字符串似乎受到了它们各自函数的适当影响。我试图更改"链接服务器"属性上的所有"服务器选项",但我没有找到合适的组合。我只是在找合适的树在这里吠叫。这是我对结果的处理,将其更改为WVARCHAR吗?还是我缺少的是我的SSMS链接服务器的某些属性需要更改?

在链接的服务器属性上,如果COLLATION COMPATIBLE设置为TRUE,问题就会得到解决。

相关内容

最新更新