使用链接服务器和ODBC的“不支持请求的转换”

使用链接服务器和ODBC的“不支持请求的转换”

问题描述:

我们的Web应用程序在VARCHAR字段中存储UTF-8编码数据。最近,我们通过ODBC使用DataDirect的OpenAccess ODBC驱动程序为我们的客户提供了访问这些数据的权限。这是通过使用DataDirect的OpenAccess SDK来实现的,它编写了一个C#.Net类来与服务进行交互。我们只允许客户执行SELECT查询。此时我们还将结果限制为100K行。使用链接服务器和ODBC的“不支持请求的转换”

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

我已经通过UTF-8编码传入查询解决了这个问题,然后通过标记VARCHAR字段返回未编码结果为WVARCHAR。这实际上工作得很好。不过,它确实意味着尽管存在(或缺少)Unicode字符,但每个VARCHAR列都会作为WVARCHAR返回。

我们目前的很多客户都采用了在自己的SQL Server实例中在SSMS中创建链接服务器的方法,这是我首选的连接方法。由于我们的服务将结果限制为100K行,因此我鼓励大家使用OPENQUERY来执行查询。不过,似乎在SSMS中链接服务器的配置中缺少一些东西。当字符串函数(左,右,SUBSTRING例如)是针对这些WVARCHAR塔中进行,SSMS返回以下错误:

OLE DB provider "MSDASQL" for linked server "LOCAL" returned message "Requested conversion is not supported.". Msg 7341, Level 16, State 2, Line 1 Cannot get the current row value of column "[MSDASQL].ColName" from OLE DB provider "MSDASQL" for linked server "LOCAL".

这将被返回的查询如此:

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

如果我要从这个查询中删除LEFT函数,FirstName列将被返回,正确解码,没有错误。

此问题不会影响MS Excel等查询。在表面上,当我调试通过与DataDirect产品接口的.Net类的方式时,字符串似乎受其各自函数的正确影响。我试图更改链接服务器属性上的所有服务器选项,但我找不到合适的组合。我只是在寻找合适的树在这里吠叫。是我对结果的处理,将它们改为WVARCHAR?或者是我的SSMS链接服务器的一些属性,我需要改变,我错过了?

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